マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

はじめのConcurrentHashMap

JDK1.8のためのConcurrentHashMapが達成される方法を確認

回路図:

マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

図1に示すように、テーブルは、内部ConcurrentHashMapのノードノードの配列であり、表の配列[I]中の各位置は、バレルを表します。キーバレルの異なるハッシュ値にマッピング。

transient volatile Node<K,V>[] table;

2、ノードのノードaの5種類

1、ノードノードは、すべてのノードの親であり、それは単独でバレルまたはバレルにリストの先頭に配置することができます。
図2は、ツリーノードのノードは、ノードから継承し、赤黒木はノードであり、ノードは、ノード赤黒木として、筒内に直接ことができません。
図3に示すように、TreeBinノード、プロキシノードのツリーノードは、バレル内に配置することができるので、プロキシノードツリーノードと呼ばれる、赤黒木のルートノードの下に接続されていてもよいです。
膨張が完了現在のバケットした後、図4に示すように、ForwardingNodeノード、拡張ノードステージを除いてノード展開は、バケットはない実際のデータの格納、クエリ、クエリ拡張テーブルにジャンプし、ノードに配置されます
5、ReservationNodeノードは、内部メソッドを使用し、あなたは無視することができます。

2.1ノードのノード

デフォルトのノードは、バレル上のノードのノードです。
ハッシュの衝突が発生した場合、ノードの数が一定数を超えた場合、ノードは、第1のノードのリンクリストは、赤黒木に変換され、表の鎖を形成するであろう。リストは、平均時間複雑度はO(N)である見つけるため、赤黒木は、平均時間複雑度はO(LOGN)である平衡二分木です。

ノードのみ次のポインタは、単一リンクリストで、リストには、検索クエリを達成するための方法を提供します
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

2.2ツリーノードノード

ツリーノードのノードが赤黒木、ツリーノードに直接[i]をテーブルにリンクされていない-浴槽上、しかしTreeBinリンクによって、TreeBinは赤黒木のルートを指します。
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)
FindTreeNode方法は、ツリーベースのルックアップを提供します。
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

2.3 TreeBinノード

直接テーブルにリンクTreeBinは、[I] -浴槽の上、ノードは動作をロック解除、赤黒木に関連する一連の動作、及びロックを提供します。
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)
さらにTreeBin動作の範囲提供
1、TreeBin(ツリーノード<Kは、 V> b)に示すように、 第1のノードBは、赤黒木のリストに変換されるであろう。
2、のlockroot()、赤黒木のルートにロック書き込み
、3 unlockRoot()、書き込みロック解除
(INTさh、オブジェクトを見つける、4 、k)の場合があり、ヌル戻りを見つけられませんでした、「等しい」ノードがそれを返す検索、ルートノード横断検索から開始見つけるための方法を一覧表示するには、ロックを書き込み、読み取りロックをブロックしません。
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)
5、removeTreeNode(ツリーノード<K、 V> p)は、 赤黒木のノードを削除します。

  1. 赤黒木のサイズが小さすぎる真、その後、ツリーを返す - >リスト変換
  2. ときに十分な赤黒木のサイズ、リンクされたリストに変更することなく、しかし、書き込みロックをノード削除する際に必要な
    6、赤黒木左利き、右利き及びアルゴリズムの一連。

2.4 ForwardingNodeノード

図1は、一時的なノードはForwardingNode継続的な拡張で、ハッシュ値が-1に固定されて表示され、実際のデータを格納しません。
2は、すべてのノードが新しいテーブルに古いテーブルの列を移行されるハッシュバケット場合、このバケットにForwardingNodeを配置します。
3、読み出し動作ForwardingNodeを直面したとき、実行後に新しいオペレーティングテーブルアレイの拡張まで転送されます。展開を支援するために試行し、操作はそれに走った書き込み、拡張の拡大が一緒にマルチスレッドをサポートすることです。
4、新しい配列に見つけるために見つける方法nextTable
マルチスレッド(XIV、ノードのConcurrentHashMapの原理)

2.5 ReservationNodeノード

図1に示すように、保持ノード。
2、ハッシュ値は-3に固定され、実際のデータが保存されていない
APIの式で二つの機能を計算し、3のみプレースホルダとして機能し、computeIfAbsentにロック

おすすめ

転載: blog.51cto.com/janephp/2412917