Colección de citas famosas - Consulta de diccionarios - Una imagen para comprender el principio subyacente de ConcurrentHashMap

Una imagen para comprender el principio subyacente de ConcurrentHashMap

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 de la matriz después de la inicialización 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, hash>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 recalculará el hash del nodo y, en función del nuevo hash, se juzgará si colocarlo 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> = 8, se convertirá en un árbol rojo-negro. Sin embargo, antes de convertirse en un árbol 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 se expande La matriz anterior, nextTable es una nueva matriz. creado durante la expansión Una vez completada la migración de 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 representa respectivamente las listas enlazadas alta y baja (cadena alta, cadena baja). Es decir, al expandir, se usará n&h==0 para determinar si el elemento debe colocarse en la posición i o i+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á n&h==0 para determinar si el elemento se coloca en la posición baja (lo) o en la posición baja. posición alta (ho) Después de determinar la ubicación del elemento, determinará si la longitud de las dos listas doblemente enlazadas (lo, ho) es mayor que 6 respectivamente. Si es mayor que 6, aún se colgará. en la matriz en la estructura de un árbol rojo-negro. Si <= 6, se convertirá en una lista vinculada unidireccional y se colgará en la matriz.