Comprenda el principio subyacente de ConcurrentHashMap en una imagen
1. La estructura de datos subyacente de ConcurrentHashMap es una tabla de matriz
2. Una lista enlazada unidireccional o un árbol rojo-negro se cuelga en la matriz de la tabla
3. new ConcurrentHashMap(); Si no se especifica la longitud, el valor predeterminado es 16 y la longitud de la matriz debe ser 2 elevado a n. Si la longitud de la inicialización personalizada no es 2 elevado a n, entonces cuando. Al inicializar la matriz, la longitud de la matriz se establecerá para que sea mayor que la longitud autodefinida. Define la longitud a la n potencia más cercana a 2. (Por ejemplo: la longitud personalizada es 7, luego la longitud real después de la inicialización de la matriz es 8)
4. La capa inferior usa sincronizado como bloqueo de sincronización, y la granularidad del bloqueo es específica bit de índice de la matriz (algunas personas lo llaman bloqueo de segmento).
5. Nodo, hash> 0. Cuando el hash entra en conflicto, se formará una lista vinculada unidireccional y se colgará en la matriz.
6. ForwardindNode, heredado de Node, su hash=-1, indica que los datos en el índice actual se han migrado a la nueva matriz
7. ReservationNode, heredado de Node , Su hash = -3 significa que el bit de índice actual está ocupado (método de cálculo)
8. TreeBin, heredado de Node, su hash = -2 significa que hay un árbol rojo-negro colgando debajo del índice actual
9. LockState es un bloqueo de lectura y escritura basado en cas implementado por la capa inferior de ConcurrentHashMap. La granularidad del bloqueo es un árbol específico. Al agregar o eliminar operaciones al árbol rojo-negro, primero se aplicará el bloqueo de sincronización y luego se aplicará el bloqueo de escritura lockState durante el autoequilibrio. Al leer el árbol rojo-negro, se aplicará el bloqueo de lectura lockState. y luego se juzgará si hay un hilo que tiene un bloqueo de escritura o hay un hilo esperando para adquirir un bloqueo de escritura. Si es así, el hilo de lectura leerá directamente la lista doblemente enlazada en lugar de leer el árbol rojo-negro. .
10. TreeNode, hashgt; 0, es el nodo específico del árbol rojo-negro. La raíz de TreeBin representa el nodo raíz del árbol rojo-negro, y primero representa el primer nodo de la lista doblemente enlazada
11. Lista doblemente enlazada: al construir el árbol rojo-negro, una lista doblemente enlazada La lista también se mantiene para los siguientes propósitos: (1)) Al escribir y leer el mismo árbol rojo-negro simultáneamente, el hilo de lectura determina que un hilo tiene un bloqueo de escritura y luego lee la lista doblemente enlazada para evitar esperas o bloqueos. el hilo de lectura debido a la escritura y lectura simultáneas. (2) Al expandirse, se recorrerá la lista doblemente enlazada, se volverá a calcular el hash del nodo y, en función del nuevo hash, se juzgará si se debe colocar en la posición alta o baja de la nueva matriz.
1. Reglas para activar la expansión:
1) Después de agregar elementos, si se determina que la cantidad de elementos en el contenedor actual ha alcanzado el umbral de expansión (longitud de la matriz * 0,75), la expansión se activará
2) Después de agregar elementos, si la longitud de la lista enlazada unidireccional es gt = 8, se convertirá en un árbol rojo-negro. Sin embargo, antes de convertirse en rojo. -árbol negro, se juzgará si la longitud de la matriz es inferior a 64. Si es inferior a 64, se activará la expansión
2. La tabla es una matriz antes de la expansión, nextTable es una nueva matriz creada durante la expansión Después de migrar datos, nextTable debe asignarse a la tabla
3. La matriz expandida tiene el doble de longitud que el grupo de elementos
4. ln y hn representan respectivamente el máximo. y listas de enlaces bajos (cadena alta, cadena baja). Es decir, al expandir, se usará namp;h==0 para determinar si el elemento debe colocarse en la posición i o en la posición de la nueva matriz. n: la longitud del grupo de elementos; h: el valor hash del elemento; i: el índice de la matriz original donde se encuentra el elemento; De esta forma, algunos elementos se colgarán en posiciones bajas y otros elementos se colgarán en posiciones altas, consiguiendo así el propósito de romper los elementos.
5. Cuando se expande el árbol rojo-negro, se recorrerá la lista doblemente enlazada y se calculará namp;=0 para determinar si el elemento se coloca en la posición baja (lo) o la posición alta (ho) Después de determinar la ubicación del elemento, juzgará si la longitud de las dos listas doblemente enlazadas (lo, ho) es mayor que 6. Si es mayor que 6, aún se colgará. en la matriz en la estructura de un árbol rojo-negro. Si lt = 6, se convertirá en una lista vinculada unidireccional y se colgará en la matriz.