synchronizedmap example ejemplo concurrent concurrency java-8 concurrenthashmap

concurrency - example - concurrenthashmap vs hashmap



ConcurrentHashMap, cuyas características concurrentes mejoraron en JDK8 (2)

Creo que hay varios cambios en comparación con JDK7:

  • Inicialización diferida: en JDK8, la memoria utilizada para cada segmento se asigna solo cuando se agrega una entidad al mapa. En JDK7, esto se hace cuando se crea el mapa.
  • Se agrega una nueva función en JDK8 como por ejemplo, reducir, buscar, etc.
  • Cambio de estructura interna: TreeBin (árbol rojo-negro) se usa en jdk8 para mejorar la eficiencia de búsqueda.

¿Puede algún experto concurrente explicar en ConcurrentHashMap, qué características concurrentes mejoraron comparando con las de JDK anteriores?


Bueno, el ConcurrentHashMap ha sido completamente reescrito. Antes de Java 8, cada ConcurrentHashMap tenía un "nivel de concurrencia" que se solucionó en el momento de la construcción. Por razones de compatibilidad, todavía hay un constructor que acepta dicho nivel aunque no lo usa de la manera original. El mapa se dividió en tantos segmentos, como su nivel de concurrencia, cada uno de ellos con su propio bloqueo, por lo que, en teoría, podría haber hasta actualizaciones simultáneas a nivel de concurrencia, si todas pasaron a segmentar segmentos diferentes, lo que depende del hashing .

En Java 8, cada cubo de hash puede actualizarse individualmente, por lo que siempre que no haya colisiones hash, puede haber tantas actualizaciones simultáneas como su capacidad actual. Esto está en línea con las nuevas características como los métodos de compute que garantizan actualizaciones atómicas, por lo tanto, el bloqueo de al menos el cubo de hash que se actualiza. En el mejor de los casos, solo bloquean ese único cubo.

Además, el ConcurrentHashMap beneficia de las mejoras generales de hash aplicadas a todo tipo de mapas hash. Cuando hay colisiones hash para un determinado segmento, la implementación recurrirá a un mapa clasificado como estructura dentro de ese segmento, degradando así a una complejidad O(log(n)) lugar de la complejidad O(n) de la implementación anterior al buscar el cubo.