ConcurrentHashMapのforEachメソッドはスレッドセーフですか?[複製]
ConcurrentHashMapのすべての要素を反復処理する場合、forEach
メソッドをスレッドセーフに使用していますか?
回答
1 JohnKugelman
スレッドセーフの意味によって異なります。
forEach
通話中に他のスレッドがマップを変更できることに問題がなければ、はい、スレッドセーフです。forEach
進行中にマップを変更できないようにし、他のスレッドがマップを変更しようとするとブロックされたりエラーが発生したりする場合は、そうではありません。
APIドキュメントは言います:
ただし、すべての操作がスレッドセーフであっても、取得操作はロックを必要とせず、すべてのアクセスを妨げる方法でテーブル全体をロックすることはサポートされていません。
..。
同様に、イテレーター、スプリッター、および列挙は、イテレーター/列挙の作成時または作成以降のある時点でのハッシュテーブルの状態を反映する要素を返します。それらはスローしません
ConcurrentModificationException
....集約ステータスメソッドの結果は...通常、マップが他のスレッドで同時に更新されていない場合にのみ役立つことに注意してください。それ以外の場合、これらのメソッドの結果は、監視または推定の目的には適切であるが、プログラム制御には適切でない一時的な状態を反映しています。