88

JavaのConcurrentHashMapとHashtableの違いは何ですか?

スレッド化されたアプリケーションにとってより効率的なのはどれですか?

4

2 に答える 2

172

ConcurrentHashMap と Hashtable のロック機構

  • HashtableCollection フレームワークに属しています。ConcurrentHashMapExecutor フレームワークに属します。
  • Hashtableデータ全体に対して単一のロックを使用します。オブジェクト レベル、つまり全体ではなく、セグメント レベル (デフォルトでは 16) で複数のロックConcurrentHashMapを使用します。Map
  • ConcurrentHashMapロックは更新にのみ適用されます。取得の場合、完全な同時実行が許可され、取得は最後に完了した更新操作の結果を反映します。そのため、書き込みがロックで行われている間、読み取りは非常に高速に発生する可能性があります。
  • ConcurrentHashMapConcurrentModificationException別のスレッドがそれを反復している間に別のスレッドがそれを変更しようとした場合、 をスローせず、null 値を許可しません。
  • ConcurrentHashMapを返しますIterator。これは、同時変更時にフェールセーフです (つまり、イテレータは内部データ構造のコピーを作成します)。
  • ConcurrentHashMapデータベース シャード ロジック ( ) はConcurrency-LevelSegment<K, V>[] segmentsとして知られています。つまり、データをシャード (セグメント) に分割し、データ全体に対して単一のロックを設定する ( ) のではなく、各シャード (セグメント) にロックを設定します。デフォルト値は 16 です。Map

ConcurrentHashMap をより技術的に理解するには、このリンクを参照してください。

次の類推は、概念のみを理解するのに役立ちます(論理ではありません)

  • とが 2 つのタイプのホームであるHashtableとします。ConcurrentHashMap
  • Hashtable家のメインドアをロックします。
  • ConcurrentHashMapメインドアの代わりに特定の部屋のドアをロックします。

スレッド化されたアプリケーションにとってより効率的なのはどれですか?

ConcurrentHashMapスレッド化されたアプリケーションではより効率的です。

于 2015-07-23T06:16:09.947 に答える
125

ConcurrentHashMap複数のバケットを使用してデータを保存します。これにより、読み取りロックが回避され、HashTable. どちらもスレッド セーフですが、 を使用すると明らかにパフォーマンスが向上しConcurrentHashMapます。

ConcurrentHashMapusingから読み取る場合、すべての操作が単純に同期される とは get()対照的に、ロックはありません。古いバージョンのJavaでリリースされましたが、Java 5+のものです。HashTableHashTableConcurrentHashMap

HashMapシングルスレッドアプリケーションで使用するのに最適です。

于 2012-09-28T19:48:12.277 に答える