JavaのConcurrentHashMapとHashtableの違いは何ですか?
スレッド化されたアプリケーションにとってより効率的なのはどれですか?
ConcurrentHashMap と Hashtable のロック機構
Hashtable
Collection フレームワークに属しています。ConcurrentHashMap
Executor フレームワークに属します。Hashtable
データ全体に対して単一のロックを使用します。オブジェクト レベル、つまり全体ではなく、セグメント レベル (デフォルトでは 16) で複数のロックConcurrentHashMap
を使用します。Map
ConcurrentHashMap
ロックは更新にのみ適用されます。取得の場合、完全な同時実行が許可され、取得は最後に完了した更新操作の結果を反映します。そのため、書き込みがロックで行われている間、読み取りは非常に高速に発生する可能性があります。ConcurrentHashMap
ConcurrentModificationException
別のスレッドがそれを反復している間に別のスレッドがそれを変更しようとした場合、 をスローせず、null 値を許可しません。ConcurrentHashMap
を返しますIterator
。これは、同時変更時にフェールセーフです (つまり、イテレータは内部データ構造のコピーを作成します)。ConcurrentHashMap
データベース シャード ロジック ( ) はConcurrency-LevelSegment<K, V>[] segments
として知られています。つまり、データをシャード (セグメント) に分割し、データ全体に対して単一のロックを設定する ( ) のではなく、各シャード (セグメント) にロックを設定します。デフォルト値は 16 です。Map
ConcurrentHashMap をより技術的に理解するには、このリンクを参照してください。
次の類推は、概念のみを理解するのに役立ちます(論理ではありません)
Hashtable
とします。ConcurrentHashMap
Hashtable
家のメインドアをロックします。ConcurrentHashMap
メインドアの代わりに特定の部屋のドアをロックします。スレッド化されたアプリケーションにとってより効率的なのはどれですか?
ConcurrentHashMap
スレッド化されたアプリケーションではより効率的です。
ConcurrentHashMap
複数のバケットを使用してデータを保存します。これにより、読み取りロックが回避され、HashTable
. どちらもスレッド セーフですが、 を使用すると明らかにパフォーマンスが向上しConcurrentHashMap
ます。
ConcurrentHashMap
usingから読み取る場合、すべての操作が単純に同期される とは
get()
対照的に、ロックはありません。古いバージョンのJavaでリリースされましたが、Java 5+のものです。HashTable
HashTable
ConcurrentHashMap
HashMap
シングルスレッドアプリケーションで使用するのに最適です。