HashMap relacionados ConcurrentHashMap


HashMap


+ Capa inferior HashMap se basa en una matriz que consiste en una lista enlazada, pero incorporada en un poco diferente jdk1.7 y 1,8.
Sólo matrices y listas enlazadas en la parte inferior de la estructura en 1.7, pero cuando una gran cantidad de conflictos de hash, que lista el conflicto es cada vez más larga, por lo que debemos tener, inevitablemente, O (n) tiempo de búsqueda es una gran pérdida de
1,8 cuando un número de nodo de hash no inferior a 8 cuando este tiempo en una complejidad estructural de color rojo-negro árbol sólo es O (log n); es para mejorar la eficiencia


problema de la expansión


Cuando la longitud de un producto más allá de un HashMap y la capacidad actual del factor de carga (por defecto = 0,75 * 16 12), el re-crear el newtable original de un HashMap dos veces el tamaño de la matriz llamando método de cambio de tamaño, la expansión máxima de 2 ^ 30 + 1, y la tabla original de todos los elementos que se mueven de hash Recalculado newtable, de acuerdo con re-hash y la posición de dispensación. Este proceso se llama repetición, ya que llama al método de hash para encontrar nueva posición cubo.

Después de una expansión de array, el punto más el rendimiento del consumo apareció: los datos originales de la matriz debe volver a calcular su posición en la nueva matriz, y en ellos, esta operación es extremadamente rendimiento de consumo. Por lo que el número de elementos en HashMap Si tuviéramos que predecir, entonces la capacidad inicial por defecto puede mejorar efectivamente el rendimiento de la HashMap.

HashMap volver a ajustar el tamaño, en el caso de condición de carrera multi-roscado puede ocurrir. Porque si dos hilos se encuentran HashMap necesidad de cambiar el tamaño, y también tratarán de ajustar el tamaño. En el proceso de cambio de tamaño, el orden de los elementos almacenados en una lista enlazada, a su vez, porque se mueve a una nueva ubicación cuando la cubeta, HashMap no toma un elemento en el extremo de la lista, pero en la cabeza, que es a fin de evitar que atraviesa la cola (de desplazamiento de la cola). Si se producen las condiciones de competencia, entonces el ciclo de la muerte.


cuestiones de seguridad hilo


En primer lugar determinar que HashMap no es seguro para subprocesos, algunos problemas extraños e impredecibles utilizarán directamente HashMap en una situación multiproceso. Uso HashMap en un multiproceso, hay varias opciones:

A. En el HashMap embalaje exterior, los mecanismos de sincronización

B. Uso Mapa m = Collections.synchronizedMap (nuevo HashMap (...)); sincronización (se refiere al programa oficial, pero no es recomendable, utilizar itera a través del tiempo para modificar la estructura del error de asignación propensa)

D. Uso java.util.Hashtable, eficiencia mínima (casi eliminado)

E. Uso java.util.concurrent.ConcurrentHashMap, relativamente seguro, eficiente (recomendado)

**

ConcurrentHashMap

**
y HashMap son muy similares, la única diferencia es uno de los datos básicos tales como el valor, y la lista es volátil modificado para garantizar la visibilidad en el momento de la adquisición.

En principio: ConcurrentHashMap utiliza una tecnología de bloqueo segmentada, que heredó de Segmento ReentrantLock. HashTable no le gustó, ya sea de venta o conseguir operaciones tiene que hacer la sincronización, CurrencyLevel apoyo teóricamente ConcurrentHashMap (número de segmentos de la matriz) de concurrencia hilo. Cada vez que un hilo que sostiene el bloqueo de acceso a un segmento, no afectará a otro segmento.

Publicado 24 artículos originales · ganado elogios 6 · vistas 1016

Supongo que te gusta

Origin blog.csdn.net/weixin_44358757/article/details/105283973
Recomendado
Clasificación