そのようなコレクションの 1 つがCopyOnWriteArrayList
. java.util.concurrent
パッケージ内の他のコレクションは、この機能を共有しています。
イテレータConcurrentModificationException
が a をスローしないという事実は、このクラスのコピー オン ライト セマンティクスの副作用です。変更するたびに、基になる配列がコピーされます。これは、頻繁に読み取られるがほとんど変更されないリストへの高速な同時アクセスを可能にするために行われます。
JavaDoc では、次のように説明されています (強調は私のものです)。
「スナップショット」スタイルの反復子メソッドは、反復子が作成された時点での配列の状態への参照を使用します。この配列はイテレータの有効期間中に変更されることはないため、干渉は不可能であり、イテレータは をスローしないことが保証されていますConcurrentModificationException
。
更新のコストが高いことに加えて、この実装にはさらにいくつかの欠点があります。
イテレータは、イテレータが作成されてからのリストへの追加、削除、または変更を反映しません。イテレータ自体 ( remove
、set
、およびadd
) に対する要素変更操作はサポートされていません。これらのメソッドは をスローしUnsupportedOperationException
ます。
これらのコレクションは、「簡単な」ループと削除を可能にするためのユーティリティではなく、多くのスレッドが変更可能なデータへの同時アクセスを必要とする同時実行性の高い状況で使用するための特殊なコレクションであることに注意してください (ただし、通常はほとんど変更されません)。 . 単純にすべてを に置き換えないでください。ArrayList
CopyOnWriteArrayList