Concurrenthashmap(略してCHM)は、ハッシュテーブルの代替としてJava 1.5で新たに導入され、同時パッケージの重要なメンバーです。 Java 1.5の前に、マルチスレッドおよび同時プログラムで安全に使用できるマップを実装する場合は、ハッシュマップがスレッドセーフではないため、ハッシュテーブルと同期マップからのみ選択できます。しかし、CHMを導入した後、より良い選択があります。 CHMはスレッドセーフであるだけでなく、ハッシュテーブルや同期マップよりも優れています。ハッシュテーブルおよび同期マップと比較して、マップ全体がロックされており、CHMは一部のマップのみをロックします。 CHMは、同期ロックを介して書き込み操作中にデータの整合性を維持しながら、同時読み取り操作を可能にします。 JDK 5および6のトップ5 Java ConcurrentコレクションでCHMの基本を学びました。このブログでは、次のポイントを紹介します。
JavaでのCONCURRENTHASHMAPの実装
CHMはセグメンテーションを導入し、ハッシュテーブルでサポートされているすべての機能を提供します。 CHMでは、マルチスレッドがマップを読み取るためにサポートされており、ブロッキングは必要ありません。これは、CHMがマップを異なる部分に分割し、更新操作を実行するときにその一部のみをロックするという事実によるものです。デフォルトの並行性レベルによると、マップは16部に分割され、異なるロックで制御されます。これは、最大16本の書き込みスレッドが同時にマップを操作できることを意味します。 16個のスレッドのみが16個のスレッドに入力されたスレッドに同時に入力されることから(読み取りスレッドはほとんど無制限です)、パフォーマンスの改善が明らかであると想像してください。ただし、put()、remove()、putall()、clear()などの一部の更新操作は操作をロックするため、検索操作は最新の結果が返されることを保証することはできません。
もう1つの重要な点は、CHMを繰り返すと、KeySetによって返されるイテレーターが弱く一貫性があり、フェイルセーフであり、最近の変更を返さない可能性があるということです。トラバーサル中、トラバースが変更された配列上のコンテンツが変更された場合、ConcurrentModificationExceptoin例外はスローされません。
CHMのデフォルトの並行性レベルは16ですが、CHMを作成するときにコンストラクターによって変更される可能性があります。並行性レベルが同時更新操作の数を表すことは間違いありません。したがって、わずかなスレッドのみがマップを更新する場合、低い並行性レベルを設定することをお勧めします。さらに、CHMはReentrantLockを使用してセグメントをロックします。
JavaのCONCURRENTHASHMAP PRUTIFABSENTメソッドの例
多くの場合、要素が存在しない場合に要素を挿入したいと考えていますが、通常は次のようにコードを書きます
同期(map){if(map.get(key)== null){return map.put(key、value); } else {return map.get(key); }}上記のコードはハッシュマップとハッシュテーブルで簡単に使用できますが、CHMにはエラーのリスクがあります。これは、CHMがパット操作中にマップ全体をロックしないため、1つのスレッドが置かれた場合(k、v)、別のスレッドがget(k)を呼び出してnullを取得するためです。もちろん、コードを同期したコードブロックにカプセル化することができます。これにより、スレッドセーフではありますが、コードが単一スレッドになります。 CHMによって提供されるプリファーブ(キー、値)方法は、上記のスレッド競争のリスクを回避しながら、同じ関数を原子的に実装します。
Concurrenthashmapを使用するタイミング
CHMは、読者の数が読者の数を超えている場合、および読者の数が読者よりも大きい場合に適しています。CHMのパフォーマンスは、ハッシュテーブルおよび同期マップのパフォーマンスよりも低くなります。これは、マップ全体がロックされている場合、読み取り操作が同じ部分に書き込み操作を実行するスレッドが終了するためです。 CHMは、プログラムの開始時に初期化されたキャッシュの作成に適しており、複数の要求スレッドでアクセスできます。 Javadocが説明するように、CHMはハッシュテーブルの優れた代替品ですが、CHMはハッシュテーブルよりもわずかに同期が少ないことを忘れないでください。
要約します
これで、Concurrenthashmapとは何か、いつconcurrenthashmapを使用するかがわかります。 CHMの重要なポイントを確認しましょう。
上記は、JavaのCHMの実装と使用シナリオです。すべての人に役立つことを願っています!このサイトへのご支援ありがとうございます!