バケットレベルのロックにより、Collections.synchronizedMap(...)/ hashtableの代わりにCHMを使用すると、パフォーマンスが向上します。
イテレータにConcurrentModificationExceptionをスローさせたくない場合は、CHMを使用することもOKです。
しかし、CHMのコンテキストでの意味と混同さthread-safe
れています。これは、変更が取得と書き込みの重複の間に反映されるのを妨げないためです。
バケットレベルのロックにより、Collections.synchronizedMap(...)/ hashtableの代わりにCHMを使用すると、パフォーマンスが向上します。
イテレータにConcurrentModificationExceptionをスローさせたくない場合は、CHMを使用することもOKです。
しかし、CHMのコンテキストでの意味と混同さthread-safe
れています。これは、変更が取得と書き込みの重複の間に反映されるのを妨げないためです。
ConcurrentHashMap
スレッドセーフとは、複数のスレッド間でオブジェクトを共有し、外部ロックなしでそのオブジェクトに同時にアクセス/変更できることを意味します。
正確なセマンティクスはドキュメントで説明されています:
取得操作(を含む
get
)は通常ブロックされないため、更新操作(およびを含む)と重複する場合がありput
ますremove
。取得は、開始時に保持されている最後に完了した更新操作の結果を反映します。
putAll
およびなどの集計操作のclear
場合、同時取得は一部のエントリのみの挿入または削除を反映する場合があります。同様に、イテレータ/列挙の作成時または作成以降のある時点でのハッシュテーブルの状態を反映する要素Iterators
を返します。Enumerations
彼らは投げませんConcurrentModificationException
。ただし、イテレータは、一度に1つのスレッドのみが使用するように設計されています。
Aixが述べたように、ConcurrentHashMap
外部ロックなしで複数のスレッド間でオブジェクトを共有することはThread-Safe
仕組みは、ConcurrentHashMap(Sunの現在の実装)が、基になるマップをいくつかの個別のバケットに分割することで機能するようなものです。要素を取得すること自体はロックを必要としませんが、アトミック/揮発性操作を使用します。これは、メモリバリア(非常にコストがかかる可能性があり、他の可能な最適化に干渉する可能性があります)を意味しますが、Collections.synchronizedMap(...)
ロックはマップ全体に適用されるため、コストがかかります。
使用法:
ConcurrentHashMap is implemented for higher throughput in cases where high concurrency is expected