web-dev-qa-db-ja.com

List.iterator()はスレッドセーフですか?

Javaの場合:List.iterator()はスレッドセーフですか?つまり、返されるイテレータはいつでもリストの現在の状態を反映しますか、それとも作成時のリストの状態だけを反映しますか?

20
ubuntudroid

List.iterator()の動作は定義されていないか、さまざまなList実装と一致していません。

ArrayList、LinkedListの場合、リストを反復処理しているときにリストが変更されると、ConcurrentModificationExceptionが発生する可能性があります。 (これは保証されていません)この問題を回避する方法は、synchronizedList()を使用して、リストを繰り返し処理しながらリストをロックすることです。

Vectorの場合、コレクションは同期されますが、イテレーターはスレッドセーフではありません。

CopyOnWriteArrayListの場合、iterator()を呼び出すときに、リスト内の要素のスナップショットを取得します。このイテレーターはスレッドセーフであり、ロックを使用する必要はありません。注:要素の内容は変更される可能性があります。

33
Peter Lawrey

スレッドセーフなイテレータはありません。反復中に基になるコレクションが変更されると、ConcurrentModificationExceptionがスローされます。

同期されたコレクションのイテレータでさえスレッドセーフではありません。手動で同期する必要があります。

1つの例外は、反復中にスナップショットを保持するCopyOnWriteArrayListです。

8
Bozho