ConcurrentHashMapのforEachメソッドはスレッドセーフですか?[複製]

Jan 05 2021

ConcurrentHashMapのすべての要素を反復処理する場合、forEachメソッドをスレッドセーフに使用していますか?

回答

1 JohnKugelman Jan 05 2021 at 11:08

スレッドセーフの意味によって異なります。

  • forEach通話中に他のスレッドがマップを変更できることに問題がなければ、はい、スレッドセーフです。
  • forEach進行中にマップを変更できないようにし、他のスレッドがマップを変更しようとするとブロックされたりエラーが発生したりする場合は、そうではありません。

APIドキュメントは言います:

ただし、すべての操作がスレッドセーフであっても、取得操作はロックを必要とせず、すべてのアクセスを妨げる方法でテーブル全体をロックすることはサポートされていません。

..。

同様に、イテレーター、スプリッター、および列挙は、イテレーター/列挙の作成時または作成以降のある時点でのハッシュテーブルの状態を反映する要素を返します。それらはスローしませんConcurrentModificationException....集約ステータスメソッドの結果は...通常、マップが他のスレッドで同時に更新されていない場合にのみ役立つことに注意してください。それ以外の場合、これらのメソッドの結果は、監視または推定の目的には適切であるが、プログラム制御には適切でない一時的な状態を反映しています。