Javaの場合:List.iterator()
はスレッドセーフですか?つまり、返されるイテレータはいつでもリストの現在の状態を反映しますか、それとも作成時のリストの状態だけを反映しますか?
List.iterator()の動作は定義されていないか、さまざまなList実装と一致していません。
ArrayList、LinkedListの場合、リストを反復処理しているときにリストが変更されると、ConcurrentModificationExceptionが発生する可能性があります。 (これは保証されていません)この問題を回避する方法は、synchronizedList()を使用して、リストを繰り返し処理しながらリストをロックすることです。
Vectorの場合、コレクションは同期されますが、イテレーターはスレッドセーフではありません。
CopyOnWriteArrayListの場合、iterator()を呼び出すときに、リスト内の要素のスナップショットを取得します。このイテレーターはスレッドセーフであり、ロックを使用する必要はありません。注:要素の内容は変更される可能性があります。
スレッドセーフなイテレータはありません。反復中に基になるコレクションが変更されると、ConcurrentModificationException
がスローされます。
同期されたコレクションのイテレータでさえスレッドセーフではありません。手動で同期する必要があります。
1つの例外は、反復中にスナップショットを保持するCopyOnWriteArrayList
です。