notas de fondo sofisticadas 10: Análisis ConcurrentHashMap

Antes de analizar ConcurrentHashMap, echar un vistazo al código fuente es la base del párrafo HashMap lo

A, HashMap

1.1 JDK1.7

Descripción general de los primeros en observar la estructura del mapa:

20200320144054

código fuente es JDK1.7 aquí para copiar hacia abajo (no sé por qué en el zip no es la fuente, pero también es necesario para compilar, demasiado perezoso para tirar).

Al observar las propiedades de HashMap, se puede ver, no hay mesa (, entrySet) son más propensos a ser un HashMap, donde en realidad se almacenan los datos:

20200319143007

1.1.1 para realizar un seguimiento de lo que primero constructor:

Se puede observar, además de la base de calibración parámetro constructor, sólo el hecho de la capacidad de ajuste por defecto, se establece el factor de umbral (el llamado factor de umbral, es decir, cuando la capacidad alcanza un cierto porcentaje, es de expansión automática):

20200319165434

1.1.2 A continuación, nos fijamos en el método put

Ahora, ponemos el método para verificar la estructura:

20200319172849

1.2 JDK1.8

El JDK1.8 HashMap hizo cambios relativamente grandes, además de la mejora en el rendimiento, también la lista ligada principalmente sido optimizado: Si la lista es demasiado larga, se ha optimizado para árbol rojo-negro, pero la estructura principal de la JDK1.7 HashMap es bastante estrecha, que se ampliará temporalmente el análisis. : Cambios y mejoras específicas de referencia recomendado la serie de Java 8 HashMap nueva comprensión .

Resumen 1.3 HashMap

Se puede ver, la base del párrafo HashMap, no está haciendo ninguna consideración de flujos seguros, es decir, en el caso de concurrentes, advertimos uso HashMap, A continuación, echar un vistazo a cómo hacer ConcurrentHashMap es seguro para subprocesos.

Dos, ConcurrentHashMap

2.1 JDK1.7

En JDK1.7, estructura ConcurrentHashMap puede decirse que la estructura de la HashMap otra cápsula días, su estructura es como sigue: se puede ver, hay una pluralidad de objetos de segmentos dentro de ConcurrentHashMap, y datos de objeto segmento array HashEntity está realmente almacenada donde el número máximo de número ConcurrentHashMap concurrente de objetos en el segmento, es los soportes mapa de bloqueo actual.

20200320145239

2.1.1 Constructor

También está comenzando a realizar el seguimiento del constructor, echar un vistazo a la nueva hora, lo que hacemos:

20200320141921

2.1.2 método put

El siguiente paso es el más crítico putmétodo, el Segmentobjeto tablearray es en el putproceso de rehashmétodo de expansión automática: Se puede observar en la operación tabla de objetos segmento (array HashEntity), será envuelto en la cerradura (trylock), el método de desbloqueo en el que para lograr un hilo de seguridad, de modo que el número máximo de número ConcurrentHashMap concurrente de objetos en el segmento, es los soportes mapa de bloqueo actual.

20200320110603

2.2 JDK1.8

En jdk1.7, se puede ver la estructura y HashMap ConcurrentHashMap completamente diferente, pero en JDK1.8, ConcurrentHashMap ser modificado en una estructura muy similar a la HashMap:

20200320212439

Aquí nos centraremos en cómo ordenar lo que está puesto en ConcurrentHashMap método JDK1.8 es lograr flujos seguros: se puede ver, el nuevo nodo en el momento, pero el uso del mecanismo de CAS operaciones libres de bloqueo, y en el nodo objeto operación que apunta a la lista / cuando el árbol (hasta una cierta longitud de la cadena será optimizado como un árbol), utilizando bloqueo sólo sincronizada. HashMap y la diferencia es que el nuevo objeto Node se cuelga en el final de la lista.

20200320211510

2.3 Resumen ConcurrentHashMap

Podemos ver que tanto JDK1.7 o 1,8, aunque el uso de un mecanismo completamente diferente, pero hecho consideraciones de hilo de seguridad, por supuesto, llevar la degradación del rendimiento es también razonable. Ahora sabemos la estructura interna de ConcurrentHashMap, en tiempo de inicialización, no sólo de una nueva dirija todo va a estar bien, pero se puede tratar en base a las necesidades del negocio, es especificar un número de inicialización de parámetros, con el fin de evitar ConcurrentHashMap frecuente expansión automática.

Supongo que te gusta

Origin juejin.im/post/5e74c973e51d4526e32c5234
Recomendado
Clasificación