2012-03-12 6 views
2

私は、コレクションXは可変オブジェクトであるCopyOnWriteArrayListは可変オブジェクトとともに使用できますか?

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

を使用しています。実際にJava Concurrency in Practiceでは、効果的に変更できないオブジェクトが適切に公開されている限り、アクセス時にそれ以上の同期は必要ないということから、スレッドセーフであることを知っています。

私はコレクションを反復処理する:やってこの方法はスレッド安全性の問題に私を公開している場合

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

私の質問はありますか? Xのmodify()メソッドは同期されているので、私の推測はそうではありません。

ありがとうございました。

答えて

3

スレッドセーフであるクラスとコレクションがある場合は、スレッドセーフな方法で一緒に使用できます。ちょっとしたことがあるかもしれませんが、私はあなたの例では何も見ません。

+0

しかし、modify()メソッドが同期されないと、それは問題になるでしょうか? – ovdsrn

+0

@ovdsrn:はい、 'X'クラス自体がスレッドセーフでない場合、そのクラスへの同時アクセスから醜い効果を得ることができます。それは 'CopyOnWriteArrayList'が壊れていることを意味するものではありません。 –

+0

これはコンポーネントの潜在的な問題であり、コレクションはまだ問題ありません。スレッドセーフなコンポーネントを同期させずに記述することができます。 –

関連する問題