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