Los principios y diferencias de HashMap, HashTable y ConcurrentHashMap
Se puede ver en el diagrama de clases que ConcurrentHashMap tiene un segmento de clase más que HashMap en la estructura de almacenamiento. ConcurrentHashMap se compone de una estructura de matriz de segmentos y una estructura de matriz HashEntry. El segmento es un bloqueo reentrante (ReentrantLock), que desempeña la función de un bloqueo en ConcurrentHashMap y se utiliza para almacenar datos de pares clave-valor. Un ConcurrentHashMap contiene una matriz de segmentos. La estructura de Segment es similar a HashMap, que es una estructura de matriz y lista vinculada. Un segmento contiene una matriz HashEntry. Cada HashEntry es un elemento de una estructura de lista vinculada. Cada segmento guarda un elemento en la matriz HashEntry. Al modificar los datos de la matriz HashEntry, primero debe obtener el bloqueo de segmento correspondiente.
ConcurrentHashMap utiliza tecnología de segmentación de bloqueo para garantizar la seguridad de los subprocesos.
Tecnología de segmentación de bloqueo: primero divida los datos en segmentos para su almacenamiento y luego asigne un bloqueo a cada segmento de datos. Cuando un hilo ocupa el bloqueo para acceder a un segmento de datos, los datos de otros segmentos pueden. también ser accedido por otros hilos.
ConcurrentHashMap proporciona un mecanismo de bloqueo diferente al de Hashtable y SynchronizedMap. El mecanismo de bloqueo utilizado en Hashtable es bloquear toda la tabla hash a la vez, de modo que solo pueda ser operada por un hilo al mismo tiempo, mientras que en ConcurrentHashMap, un depósito está bloqueado a la vez;
La razón por la cual el contenedor Hashtable es ineficiente en un entorno concurrente altamente competitivo es porque todos los subprocesos que acceden a Hashtable deben competir por el mismo bloqueo. Si hay varios bloqueos en el contenedor, cada bloqueo se usa para Lock. parte de los datos en el contenedor, cuando varios subprocesos acceden a datos en diferentes segmentos de datos en el contenedor, no habrá competencia de bloqueo entre subprocesos, lo que puede mejorar efectivamente la eficiencia del acceso concurrente. Esta es la tecnología de segmentación de bloqueos utilizada por ConcurrentHashMap. . Primero, los datos se dividen en segmentos para su almacenamiento y luego a cada segmento de datos se le asigna un bloqueo. Cuando un subproceso ocupa el bloqueo para acceder a un segmento de datos, otros subprocesos también pueden acceder a los datos de otros segmentos.