2012-03-12 86 views
2

我使用的是集合可以將CopyOnWriteArrayList與可變對象一起使用嗎?

CopyOnWriteArrayList<X> myCOW = new CopyOnWriteArrayList<X>(); 

其中X是一個可變對象。我知道從Java的併發實踐中說,「寫時複製集合從線程安全中獲得了這樣的事實:只要一個有效的不可變對象被正確發佈,在訪問它時就不需要進一步的同步。」

我遍歷集合:

for (X x : myCOW) { 
    if (conditionIsMet) { 
     x.modify(); // modify() is a synchronized method in class X 
    } 
    } 

我的問題是,如果這樣做的這種方式暴露我線程安全的問題?我的猜測是,因爲X的modify()方法是同步的。

謝謝。

回答

3

如果您有一個線程安全的類和集合,它們可以以線程安全的方式一起使用。可能有些問題,但我沒有看到你的例子。

+0

但是,如果modify()方法不會被同步,那麼這將是一個問題,不是? – ovdsrn 2012-03-12 08:25:24

+0

@ovdsrn:是的,如果你的''X類本身不是線程安全的,那麼你可以從併發訪問中獲得難看的效果。儘管如此,這並不意味着'CopyOnWriteArrayList'壞了。 – 2012-03-12 08:29:01

+0

這將是一個潛在的問題,該組件,收集仍然會罰款。可以在不同步的情況下編寫一個線程安全的組件。 – 2012-03-12 08:29:34

相關問題