Многопоточность (XIV, принцип ConcurrentHashMap узла)

Введение ConcurrentHashMap

Для JDK1.8 увидеть, как ConcurrentHashMap достигается

Схема:

Многопоточность (XIV, принцип ConcurrentHashMap узла)

1, таблица представляет собой массив из внутреннего узла Node ConcurrentHashMap, каждая позиция в массиве таблицы [I] представляет баррель. Подключенный к различным значением хеш-ключа баррель.

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

2, узел Пять типов узлов а

1, узел узел является родителем всех узлов, он может быть помещен в стволе отдельно или в виде главе списка в ствол.
2, TreeNode узел наследует от узла, красно-черное дерево является узлом, узел не может быть непосредственно в ствол, только в качестве узла красно-черного дерева.
3, TreeBin узел, узел TreeNode прокси, могут быть размещены в стволе, может быть соединен ниже корневого узла красно-черного дерева, так называемые прокси - узел TreeNode.
4, ForwardingNode узел, расширение узла, за исключением стадии узла расширения, после того , как расширение полного тока ведра, ковш будет размещено в узле, то запрос будет переходить к таблице расширения запроса, а не фактическое хранения данных
5, ReservationNode узел, использовать внутренние методы, вы можете игнорировать.

2.1 Узел Узел

узел по умолчанию является узел Node на стволе.
Когда происходит хэш столкновение, узел будет первый узел ссылка , чтобы сформировать цепочку из таблицы, когда количество узлов превышает определенное число, то список будет преобразован в красно-черное дерево. Поскольку список , чтобы найти среднюю временную сложность О (п), красно-черное дерево является сбалансированным бинарное дерево, которое является средней сложности время O (LOGN).

Узел только следующий указатель в один список, список предоставляет способ для достижения найти запрос
Многопоточность (XIV, принцип ConcurrentHashMap узла)

Многопоточность (XIV, принцип ConcurrentHashMap узла)

2.2 TreeNode узел

TreeNode узел красно-черное дерево, TreeNode не могут быть непосредственно связаны с таблицей [I] - над ванной, а по ссылке, TreeBin точек TreeBin к корню красно-черного дерева.
Многопоточность (XIV, принцип ConcurrentHashMap узла)
Метод FindTreeNode обеспечивает дерева на основе поиска.
Многопоточность (XIV, принцип ConcurrentHashMap узла)

2,3 узла TreeBin

TreeBin напрямую связана с таблицей [I] - над ванной, узел обеспечивает ряд операций , связанных с красно-черного дерева, и блокировка, разблокировка операции.
Многопоточность (XIV, принцип ConcurrentHashMap узла)
Далее TreeBin предлагает большой выбор операции
1, TreeBin (TreeNode <К, V> б), будет первым узлом B преобразуется в красно-черный список дерева.
2, lockroot (), на красно-черный корень дерева написать замок
3, unlockRoot (), снять блокировку записи
4, найти (INT час, объект к), начать с корневого узла поиска обхода, найти «равный» узел возвращает его, не нашел возвращает нулевое значение, когда блокировка записи в список способов поиска, не блокируют блокировки чтения.
Многопоточность (XIV, принцип ConcurrentHashMap узла)
5, removeTreeNode (TreeNode <К, V> р), удалить красно-черный узел дерева:

  1. Красно-черный размер дерева слишком мал, возвращает значение ИСТИНА, то дерево -> преобразование списка
  2. Когда достаточное количество красно-черный размер дерева, без изменения в связанном списке, но записи блокировки требуется при удалении узлов
    6, красно-черное дерево левой рукой, правые и ряд алгоритмов.

2.4 ForwardingNode узел

1, ForwardingNode появляется временный узел в текущем расширении, хеш - значение фиксируется на -1, а не хранит фактические данных.
2, если хэш ведром все узлы мигрировали старый массив таблицы в новую таблицу, а затем поместить ForwardingNode в этом ведре.
3, операция чтения при столкновении ForwardingNode, будут направлены на новое расширение массива операционного стола вверх после выполнения, операция записи в него врезался, а затем попытаться помочь расширение, расширение расширения является поддержка многопоточных вместе.
4, метод поиска , чтобы найти на новом массиве nextTable
Многопоточность (XIV, принцип ConcurrentHashMap узла)

2.5 ReservationNode узел

1, удержание узла.
2, значение хеш - функции фиксируется на -3, фактические данные не сохраняются
3, действует только в качестве заполнителя и заперли в computeIfAbsent вычислить две функции в формуле API

рекомендация

отblog.51cto.com/janephp/2412917
рекомендация