Programación concurrente en profundidad de Java-ConcurrentHashMap

Este artículo es para leer notas, el libro es el arte de la programación concurrente de Java. El
libro parece ser 1.6.
Descubrí que el jdk8 no puede encontrar los segmentos.

1. ¿Por qué usar ConcurrentHashMap?

En un entorno de subprocesos múltiples, el uso de HashMap para operaciones de colocación provocará un bucle sin fin, lo que dará como resultado una utilización de la CPU cercana al 100%, por lo que HashMap no se puede usar en situaciones concurrentes.

HashMap provocará un bucle sin fin al ejecutar operaciones put simultáneamente, porque el subprocesamiento múltiple hará que la lista enlazada de entrada de HashMap forme una estructura de datos en anillo. Una vez que se forma la estructura de datos en anillo, el siguiente nodo de la entrada nunca estará vacío, y se generará un bucle sin fin para obtener la entrada.

El principio es: al agregar elementos a HashMap, hará que la expansión del contenedor de HashMap
pueda referirse

La tecnología de segmentación de bloqueo de ConcurrentHashMap puede mejorar efectivamente la tasa de acceso concurrente; la razón por la cual el contenedor HashTable muestra ineficiencia en un entorno concurrente altamente competitivo es que todos los hilos que acceden a HashTable deben competir por el mismo bloqueo . Cada bloqueo se utiliza para bloquear parte de los datos en el contenedor, por lo que 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. Este es el bloqueo utilizado por ConcurrentHashMap Tecnología de segmentación.

2. La estructura de ConcurrentHashMap (no la estructura 1.8)

Inserte la descripción de la imagen aquí
El segmento es un bloqueo reentrante (ReentrantLock), que desempeña el papel de bloqueo en ConcurrentHashMap;

HashEntry se utiliza para almacenar datos de valores clave.

Un ConcurrentHashMap contiene una matriz de segmentos.

Un segmento contiene una matriz HashEntry. Cada HashEntry es un elemento de una estructura de lista vinculada. Cada segmento protege los elementos en una matriz HashEntry. Al modificar los datos de la matriz HashEntry, primero debe obtener el bloqueo de segmento correspondiente .

static class Segment<K,V> extends ReentrantLock implements Serializable {

    }

Se puede ver que Segment hereda de ReentrantLock, ya sabes, puede actuar como un bloqueo

jdk1.6 ConcurrentHashMap ver este artículo

Estructura ConcurrentHashMap (estructura 1.8)

CAS + sincronizado + hashentry

https://blog.csdn.net/programmer_at/article/details/79715177

La diferencia entre jdk1.7 y 1.8

https://www.jianshu.com/p/e694f1e868ec
https://blog.csdn.net/xingxiupaioxue/article/details/88062163

¿Puede ConcurrentHashMap reemplazar completamente a HashTable?

Consistencia fuerte y consistencia débil.

De hecho, solo hay dos tipos de consistencia de datos, consistencia fuerte y consistencia débil. La consistencia fuerte también se llama consistencia lineal. Además de esto, toda otra consistencia es un caso especial de consistencia débil. La llamada consistencia fuerte significa que la replicación es sincrónica, y la consistencia débil significa que la replicación es asincrónica.

El usuario actualiza el avatar del sitio web. En algún momento, el usuario envía una solicitud de actualización a la biblioteca principal, y la biblioteca principal recibe la solicitud poco después. En un momento determinado, la base de datos maestra reenviará los cambios de datos a su propia base de datos esclava. Finalmente, la biblioteca principal informa al usuario que la actualización fue exitosa.

Si la biblioteca maestra necesita esperar la confirmación de la biblioteca esclava antes de devolver la "actualización exitosa" y hacer que el nuevo avatar sea visible para otros usuarios, para asegurarse de que la biblioteca esclava ha recibido una operación de escritura, la replicación se sincroniza, es decir, una gran coherencia. Si la biblioteca maestra escribe con éxito y no espera la respuesta de la biblioteca esclava, devuelve "actualización correcta" directamente, entonces la replicación es asíncrona, es decir, una consistencia débil.

Una consistencia sólida puede garantizar que la biblioteca esclava tenga datos consistentes con la biblioteca maestra. Si la biblioteca principal se cae repentinamente, aún podemos garantizar la integridad de los datos. Sin embargo, si la biblioteca secundaria está inactiva o la red está bloqueada, la biblioteca primaria no puede completar la operación de escritura.

En la práctica, generalmente hacemos que una biblioteca esclava sea síncrona, mientras que otras son asíncronas. Si hay un problema con este esclavo síncrono, sincronice otro esclavo asíncrono. Esto garantiza que siempre haya dos nodos con datos completos: la biblioteca maestra y la biblioteca esclava síncrona. Esta configuración se llama semisíncrona.

https://my.oschina.net/hosee/blog/675423

Publicado 37 artículos originales · ganado elogios 6 · vistas 4630

Supongo que te gusta

Origin blog.csdn.net/littlewhitevg/article/details/105604100
Recomendado
Clasificación