2

CopyOnWriteArrayListとの両方の反復子 ConcurrentHashMap はフェイルセーフであり、CME をスローしません。

INCopyOnWriteArrayList<E>イテレータは、元の基になる配列のスナップショットに基づいて構築されています。したがって、ここのイテレータはフェイルセーフであり、スレッドセーフでもあります。

Javadcos は、スナップショットCopyOnWriteArrayList<E> という用語を明確に述べています。

「スナップショット」スタイルの反復子メソッドは、反復子が作成された時点での配列の状態への参照を使用します。この配列は反復子の有効期間中に変更されることはないため、干渉は不可能であり、反復子は ConcurrentModificationException をスローしないことが保証されています。

元の基になるマップのスナップショットConcurrentHashMapにも基づいて構築されたイテレータの場合は?

ありがとう...

4

1 に答える 1

5

必ずしもそうではありません-javadocを参照してください(強調鉱山)

同様に、 Iterators と Enumerationsは、 iterator/enumeration の作成時または作成後のある時点でのハッシュ テーブルの状態を反映する要素を返します。

valuesentrySetおよびkeySetメソッドを見ると、次のようになります。

ビューのイテレータ [...] は、イテレータの構築時に存在していた要素をトラバースすることを保証し、構築後の変更を反映する可能性があります (ただし、保証はされません)。

于 2012-10-09T12:32:56.010 に答える