Colección de citas famosas - Slogan de motivación - Los principios y diferencias entre HashMap, HashTable y ConcurrentHashMap

Los principios y diferencias entre HashMap, HashTable y ConcurrentHashMap

Como se puede ver en el diagrama de clases, ConcurrentHashMap tiene un segmento de clase más que HashMap en la estructura de almacenamiento. ConcurrentHashMap consta de una estructura de matriz de segmentos y una estructura de matriz HashEntry. Segment es un ReentrantLock, que desempeña el papel de un candado en ConcurrentHashMap. HashEntry se utiliza para almacenar datos de pares clave-valor. 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 y 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 almacene los datos en segmentos y luego asigne un bloqueo a cada segmento de datos. Cuando un subproceso ocupa un candado para acceder a un segmento de datos, otros subprocesos también pueden acceder a los datos de otros segmentos.

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 un subproceso pueda operar al mismo tiempo; sin embargo, en ConcurrentHashMap, solo se puede bloquear un depósito a la vez;

La razón por la que los contenedores de tablas hash son ineficientes en entornos concurrentes altamente conflictivos es que todos los subprocesos que acceden a la tabla hash deben competir por el mismo bloqueo. Si hay varios bloqueos en el contenedor y cada bloqueo se usa para bloquear parte de los datos en el contenedor, cuando varios subprocesos accedan a datos en diferentes segmentos de datos en el contenedor, no habrá competencia de bloqueos entre subprocesos, lo que puede efectivamente mejorar la eficiencia del acceso concurrente. Esta es la técnica de segmentación de bloqueos utilizada por ConcurrentHashMap. Primero, los datos se almacenan en segmentos de datos y luego se asigna un bloqueo a cada segmento de datos. Cuando un subproceso ocupa un candado para acceder a un segmento de datos, otros subprocesos también pueden acceder a los datos de otros segmentos.