Cómo utilizar ConcurrentHashMap en Java
ConcurrentHashMap bloquea de una manera ligeramente más granular. ConcurrentHashMap divide la tabla hash en 16 depósitos (valor predeterminado) y las operaciones comunes como obtener, colocar y eliminar solo bloquean los depósitos actualmente requeridos.
Imagina que antes solo podías dejar entrar un hilo, pero ahora puedes dejar entrar 16 hilos de escritura al mismo tiempo (los hilos de escritura requieren bloqueos, mientras que los hilos de lectura son casi ilimitados, como veremos más adelante). punto), la mejora en la concurrencia es obvia.
Lo que es aún más sorprendente es la concurrencia de lectura de ConcurrentHashMap, porque en la mayoría de los casos no se requiere ningún bloqueo para la lectura, por lo que la lectura es casi completamente concurrente, mientras que la granularidad de bloqueo para la escritura es muy buena. que antes (esto se notará más cuando haya más cubos). El único momento en el que necesita bloquear toda la tabla es para operaciones como el tamaño.
Al iterar, ConcurrentHashMap utiliza un iterador rápido que es diferente de las colecciones tradicionales, a las que llamamos iteradores débilmente consistentes. En esta iteración, ya no se generará ConcurrentModificationException cuando la colección cambie nuevamente después de crear el iterador. En cambio, los nuevos datos modificados se reemplazarán, de modo que los datos originales no se verán afectados. El puntero principal se reemplazará después del iterador. se completa para nuevos datos, de modo que el subproceso iterador pueda usar los datos antiguos y el subproceso de escritura pueda completar los cambios al mismo tiempo. Más importante aún, esto garantiza la continuidad y escalabilidad de múltiples subprocesos que se ejecutan al mismo tiempo, lo cual es la clave para mejorar.
Analicemos el código fuente de ConcurrentHashMap. Analizar principalmente Segmento, porque las operaciones básicamente se realizan en Segmento. Primero mire la definición de los datos internos del segmento.