web-dev-qa-db-ja.com

JavaのConcurrentHashMapとHashtable

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

スレッド化されたアプリケーションではどちらが効率的ですか?

60
sheidaei

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

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

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

93
Lucas Holt

ConcurrentHashMapおよびHashtableロックメカニズム

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

ConcurrentHashMapをより技術的に理解するには、こちらをご覧ください link

次の例えは、概念のみを理解するのに役立ちます(ロジックではなく)

  • HashtableConcurrentHashMapは2種類のホームであると想定します。
  • Hashtableは家のメインドアをロックします。
  • ConcurrentHashMapは、メインドアの代わりに特定の部屋のドアをロックします。

スレッド化されたアプリケーションではどちらが効率的ですか?

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

109
Premraj