Введение ConcurrentHashMap
Для JDK1.8 увидеть, как 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).
Узел только следующий указатель в один список, список предоставляет способ для достижения найти запрос
2.2 TreeNode узел
TreeNode узел красно-черное дерево, TreeNode не могут быть непосредственно связаны с таблицей [I] - над ванной, а по ссылке, TreeBin точек TreeBin к корню красно-черного дерева.
Метод FindTreeNode обеспечивает дерева на основе поиска.
2,3 узла TreeBin
TreeBin напрямую связана с таблицей [I] - над ванной, узел обеспечивает ряд операций , связанных с красно-черного дерева, и блокировка, разблокировка операции.
Далее TreeBin предлагает большой выбор операции
1, TreeBin (TreeNode <К, V> б), будет первым узлом B преобразуется в красно-черный список дерева.
2, lockroot (), на красно-черный корень дерева написать замок
3, unlockRoot (), снять блокировку записи
4, найти (INT час, объект к), начать с корневого узла поиска обхода, найти «равный» узел возвращает его, не нашел возвращает нулевое значение, когда блокировка записи в список способов поиска, не блокируют блокировки чтения.
5, removeTreeNode (TreeNode <К, V> р), удалить красно-черный узел дерева:
- Красно-черный размер дерева слишком мал, возвращает значение ИСТИНА, то дерево -> преобразование списка
- Когда достаточное количество красно-черный размер дерева, без изменения в связанном списке, но записи блокировки требуется при удалении узлов
6, красно-черное дерево левой рукой, правые и ряд алгоритмов.
2.4 ForwardingNode узел
1, ForwardingNode появляется временный узел в текущем расширении, хеш - значение фиксируется на -1, а не хранит фактические данных.
2, если хэш ведром все узлы мигрировали старый массив таблицы в новую таблицу, а затем поместить ForwardingNode в этом ведре.
3, операция чтения при столкновении ForwardingNode, будут направлены на новое расширение массива операционного стола вверх после выполнения, операция записи в него врезался, а затем попытаться помочь расширение, расширение расширения является поддержка многопоточных вместе.
4, метод поиска , чтобы найти на новом массиве nextTable
2.5 ReservationNode узел
1, удержание узла.
2, значение хеш - функции фиксируется на -3, фактические данные не сохраняются
3, действует только в качестве заполнителя и заперли в computeIfAbsent вычислить две функции в формуле API