banner
RustyNail

RustyNail

coder. 【blog】https://rustynail.me 【nostr】wss://ts.relays.world/ wss://relays.world/nostr

【翻訳】JavaにおけるConcurrentHashMap、Hashtable、およびSynchronized Mapの違い

翻訳結果:

翻訳元:Javarevisited's Blog

ConcurrentHashMap vs Hashtable vs Synchronized Map#

これらの 3 つのクラスは、Java の並行プログラムでマルチスレッドセーフに使用することができますが、それらの間には特徴的な違いがあります。主に、彼らがどのようにスレッドセーフを実現しているかに現れています。

HashTable は Java1.1 で登場し、同期メソッドを使用してスレッドセーフを実現しています。Hashtable のメソッドはすべて Synchronized ですが、これによりスレッドが増えると遅くなります。
Synchronized Map と Hashtable にはほとんど違いがありませんが、両方ともCollections.synchronizedMap()メソッドを使用して任意の Map を同期バージョンにすることができます。

一方、ConcurrentHashMap は、並行プログラミングに特化して設計されています。デフォルトでは、外部の同期措置なしで 16 個のスレッドが Map を読み書きできます。
内部的にセグメントロックが実装されているため、拡張性がかなりあります。Synchronized Map や Hashtable とは異なり、ConcurrentHashMap はマップ全体をロックせず、マップをセグメント(Segment)に分割してそれぞれにロックをかけます。
そのため、読み取り(ロックなしの get)のパフォーマンスが書き込みよりも高くなります。

正直なところ、JavaAPI の中核である Collections クラスは、慎重に使用する必要があると思います。個人的な経験から言えば、Vector などの不要なものの代わりに ArrayList を使用すると、Java アプリケーションのパフォーマンスが向上することがあります。
Java5 以前では、Java コレクションフレームワークの問題の 1 つは、拡張性の欠如でした。

ハッシュテーブルやベクターのような遺産システムは、多くのスレッドを持つ Java アプリケーションではすぐにボトルネックになります。Java1.5 以降、拡張性が提案され、データ量が多い場合でも効率的に保つための優れた並行コンテナが推奨されています。
高速な並行アクセスをサポートするデータストレージの能力を持つ電子取引システムなどの遺産システム。

この記事では、ConcurrentHashMap、Hashtable、HashMap、および synchronized Map について説明し、Java での ConcurrentHashMap、Hashtable、および synchronized Map の違いについても探求しました。また、Hashtable と HashMap の違いについても説明し、これらは面接でいくつかの質問に答えるのに役立つかもしれません。

ConcurrentHashMap と CopyOnWriteArrayList がなぜ必要なのか#

同期コンテナ(Hashtable、Vector、Collections.synchronizedMap ()、Collections.synchronizedList () など)は、オプションのスレッドセーフな Map または List の実装を提供します。
ただし、いくつかの要因により、これらは高並行プログラムには適していない場合があります。たとえば、大きな範囲のロックは拡張性を妨げ、通常、イテレーションアクセス時には ConcurrentModificationException を防ぐためにコンテナ全体をロックする必要があります。

ConcurrentHashMap と CopyOnWriteArrayList の実装は、より高い並行性を提供しながら、呼び出し元に最小のコストでスレッドセーフを保証します。
ConcurrentHashMap と CopyOnWriteArrayList はどこでも必ずしも必要ではありませんが、特定の状況(つまり、並行安全性)で HashMap や ArrayList を使用することもできます。これらを使用すると、多くの並行プログラムで利点を得ることができます。

ConcurrentHashMap と Hashtable の違い#

したがって、ConcurrentHashMap と Hashtable の違いは何ですか?両方ともマルチスレッド環境で使用できますが、Hashtable のサイズが大きくなるとパフォーマンスにかなりのコストがかかります。なぜなら、アクセス時にコンテナ全体にロックがかかるからです。

ConcurrentHashMap はデータをセグメントに分割し、データ量に関係なくロックされる範囲にのみ関心を持ちます。スレッドセーフを保証しながら、多くの他の読み取りスレッドがイテレーションが完了する前にコンテナにアクセスできます。

まとめると、イテレーション時に ConcurrentHashMap はマップの一部のみをロックしますが、HashMap はマップ全体をロックします。この図は、Java ConcurrentHashMap の内部動作原理を明確に示しています。

ConcurrentHashMap

ConcurrentHashMap と Collections.synchronizedMap の違い#

ConcurrentHashMap は並行設計され、パフォーマンスが向上しています。HashMap はデフォルトでは非同期ですが、synchronized Map でラップすることで同期コンテナにすることができます。ConcurrentHashMap と Collections.synchronizedMap の違いは次のとおりです:

ConcurrentHashMap は、null キーまたは null 値を許容しませんが、synchronized HashMap は null キーを許容します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。