2016-04-13 2 views
0

私はArrayList<ConcurrentLinkedQueue>を反復処理するワーカースレッドを持っています。他のスレッドはオブジェクト(キュー)を追加したり削除したりすることができます。しかし、ArrayListはスレッドセーフではありません。 ArrayList<ConcurrentLinkedQueue>の代わりにConcurrentLinkedQueue<ConcurrentLinkedQueue>を使用しても問題ありませんか?ListではなくJava ConcurrentLinkedQueue?

+2

'List'はインターフェイスです。いくつかの実装はスレッドセーフ(例えば 'CopyOnWriteArrayList')、他は実装されていません(例えば' ArrayList')。 –

+0

違いは何ですか?なぜ、ConcurrentLinkedQueueは機能しないのですか、それとも悪いのですか? – stonar96

+1

私はそれがあなたが何をする必要があるかによって異なると思う。私はあなたの要件についてさらに詳しく述べたいと思います。 –

答えて

2

ConcurrentLinkedQueueを安全に反復できるかどうかを確認する場合は、答えはYesです。 javadocは言う:

Iteratorsは、イテレータの作成時または以来、いくつかの点でキューの状態を反映する要素を返し、弱い一貫しています。 彼らはConcurrentModificationExceptionを投げず、他の操作と並行して進めることができます。イテレータの作成以降にキューに含まれる要素は、一度だけ返されます。

はしかし、あなたはQueue上で行うことはできませんList上にできることがある(例えば、位置取得/設定、任意の要素の挿入/除去が。)アプリケーションがこれらの事を行う必要があるか類似している場合ArrayListの代わりにConcurrentLinkedQueueを使用すると動作しません。

また、ConcurrentLinkedQueue.size()O(N)操作であることに注意してください。

関連する問題