Javaで並行ハッシュマップを最適に実装する方法は?



この記事では、Javaでの並行ハッシュマップと呼ばれる概念を紹介し、実際のデモンストレーションを行います。

この記事では、Concurrent Hash MapInと呼ばれる概念を紹介します。 そして、実際のデモンストレーションでフォローアップします。この記事では、次のポイントについて説明します。

Javaでの並行ハッシュマップに関するこの記事に進む





ConcurrentHashMapは内部でどのように機能しますか?

Java 5以降、HashTableの代わりにConcurrentHashMapが導入されました。 synchronizedMap()と呼ばれるユーティリティクラスメソッドを使用して同期マップを取得することもできますが、このメソッドには欠点があります。つまり、一度に1つのスレッドしかアクセスできないため、パフォーマンスが非常に低くなります。したがって、ConcurrentHashMapはこれらの問題に対処します。



Javaでの並行ハッシュマップに関するこの記事に進む

なぜ他の地図?

すでにHashMap、HashTableがあり、ConcurrentHashMapが必要なのは、スレッドセーフであると同時にパフォーマンスが向上するためです。

Javaでの並行ハッシュマップに関するこの記事に進む



どう違うの?

これもハッシュに基づいていますが、ロック戦略によってパフォーマンスが向上しています。 HashTableやSynchronizedHashMapとは異なり、各メソッドに同じロックを適用するのではなく、メソッドごとに個別のロックを使用します。この目的のために再入可能ロックを使用します。 HashMapと同様に、ConcurrentHashMapには16個のバケット、つまりセグメントがあり、16個を超えるバケットを持つConcurrentHashMapを作成するために、さまざまなコンストラクターがあります。

詳細に話す前に、以下のいくつかの概念を確認しましょう。

ConcurrentHashMap:このマップは同時スレッドアクセスを許可します。マップの追加または更新中に、セグメントと呼ばれるマップの一部、つまり基になるデータ構造のみがロックされます。これにより、同時スレッドアクセスでロックせずにデータを読み取ることができます。パフォーマンスを向上させるために導入されました。

  • 同時実行レベル:同時に更新されるスレッドの推定数です。
  • Load-Factor:サイズ変更係数を制御するために使用される値です。
  • 初期容量:指定されたサイズでマップを作成するプロパティです。

下の図を見て、ConcurrentHashMapがどのように機能するかを理解してみましょう。

画像-同時ハッシュマップ-Edureka

したがって、上の図では、16個のロックがあり、マップの一部のみをロックして、別のスレッドから他のメソッドにアクセスできるようにして、パフォーマンスを向上させています。

HashMapと同様に、ConcurrentHashMapも同様に機能し、デフォルトで16のセグメントを含み、ハッシュによって要素を格納するため、要素が同じハッシュを持っている場合、リンクリストを使用して上の図に示すように同じセグメントに格納されます。

Javaでの並行ハッシュマップに関するこの記事に進む

ConcurrentHashMapとHashMapの違い

HashMapはCollectionsに属していますが、ConcurrentHashMapはConcurrent Collectionsに属していますが、それらの間には他にも多くの違いがあります。

  • ConcurrentHashMapはスレッドセーフ、つまり同期されていますが、HashMapは同期されていません。
  • ConcurrentHashMapは、スレッドが待機しなければならない場合があるため同期されているためパフォーマンスが低くなりますが、HashMapは同期されておらず、すべてのスレッドが同時にアクセスできるため、パフォーマンスが高くなります。
  • 2つのスレッドが同時にオブジェクトのコンテンツを変更または追加しようとすると、ConcurrentModificationExceptionが発生します。ただし、ConcurrentHashMapの場合、同じ操作を実行している間は例外は発生しません。

  • HashMapのキーと値にはnull値を使用できますが、ConcurrentHashMapではキーと値にnull値を使用できません。null値を追加しようとすると、例外、つまりNullPointerExceptionが発生します。

    クラスをシングルトンにする方法
  • HashMapはJDK1.2で導入されていますが、ConcurrentHashMapはJDK1.5で導入されています。

パフォーマンスを向上させるために以前に見たように、それは以前はテーブルセグメントであったテーブルバケットとしてのノードの配列で構成されています Java 8

バケットは、最初の挿入が実行されるときに遅延初期化されます。バケットの最初のノードをロックすることにより、すべてのバケットを個別にロックできます。また、読み取り操作はブロックされません。

に比べ HashMap、ConcurrentHashMap 追加のを提供します concurrencyLevel 使用する推定スレッド数を制御する引数。

コンストラクター:

  1. ConcurrentHashMap m = new ConcurrentHashMap()

    新しい空のマップが作成され、デフォルトの初期容量は16、負荷係数は0.75、同時実行レベルは16です。

  2. ConcurrentHashMap m = new ConcurrentHashMap(int initialCapacity)
    指定された初期容量、0.75の負荷係数、および同時実行レベル16で、新しい空のマップが作成されます。

  3. ConcurrentHashMap m = new ConcurrentHashMap(int initialCapacity、float loadFactor)

    新しい空のマップが、指定された初期容量と同時実行レベル16の負荷係数で作成されます。

  4. ConcurrentHashMap m = new ConcurrentHashMap(int initialCapacity、float loadFactor、int concurrencyLevel)
    指定された初期容量、負荷率、および同時実行レベルで、新しい空のマップが作成されます。

  5. ConcurrentHashMap m = new ConcurrentHashMap(Map m)
    提供されたマップから新しいConcurrentHashMapを作成します。

他の2つの引数:initialCapacityとloadFactorは、HashMapとまったく同じように機能しました。
ConcurrentMapは、マルチスレッド環境でのキー/値操作で一貫性のあるメモリです。

Javaでの並行ハッシュマップに関するこの記事に進む

落とし穴

オブジェクトの取得中、ConcurrentHashMapはブロックされず、更新操作と重複する可能性があるため、パフォーマンスを向上させるために、最後に完了した更新操作のみを取得します。

size、isEmpty、containsValueなどの集計ステータスメソッドの結果は、通常、マップが他のスレッドで同時に更新されていない場合にのみ役立ちます。

同時更新が適切に制御されている場合、これらのステータスメソッドは信頼できます。

これらの方法はリアルタイムで保証するものではありませんが。

デフォルトのテーブル容量は16ですが、同時実行レベルを使用して変更できます。

public ConcurrentHashMap(int initialCapacity、float loadFactor、int concurrencyLevel){// ... if(initialCapacity

キーキーを並べ替える必要がある場合は、ConcurrentSkipListMapを使用できます。

上記のプログラムを実行すると、Javaの並行ハッシュマップを理解できたはずです。このようにして、この記事の終わりになりました。詳細を知りたい場合は、 、信頼できるオンライン学習会社。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Hibernate&SpringなどのさまざまなJavaフレームワークに加えて、コアJavaコンセプトと高度なJavaコンセプトの両方についてトレーニングするように設計されています。

質問がありますか?この記事のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。