Cepillo preguntas de la entrevista 10: ConcurrentHashMap cómo garantizar la seguridad del hilo?

image.png




Marco de la colección HashTable, Montón, recogida de envases y sincronización son muy ineficientes en escenarios de alta concurrencia, Java proporciona la contratación y hacer frente a escenarios de alta concurrencia.


Estaba Li Fuchun, me preparo para la entrevista, el problema de hoy es?

java que proporciona contenedores concurrentes? Cómo ConcurrentHashMap seguridad de los subprocesos de garantía?

Sistema de contenedores concurrentes java



sistema de recipiente de sincronización java tiene la siguiente:

. 1, la HashTable, contenedor sincronización Stack, para asegurar la sincronización interna palabra clave sychronized;

2, la envoltura síncrono Collections.synchronizedMap (), la clave interna se utiliza para asegurar la sincronización sychronized;

3, el recipiente proporciona la sincronización y el contrato, tales ConcurrentHashMap, CopyOnWriteArrayList, ArrayBlockingQueue, SynchronizedQueue

análisis simultáneo de ConcurrentHashMap



¿Por qué hay ConcurrenHashMap?

1, el pobre rendimiento HashTable bajo escenarios de alta concurrencia;

2, HashMap es no seguro para subprocesos contenedor;

3, envoltura síncrono Aunque el uso de método de sincronización mejoró rápidamente rendimiento de la pieza, pero todavía no es adecuado para un rendimiento bajo escenarios de alta concurrencia la demanda;



la siguiente pregunta a responder, cómo la seguridad hilo de garantía ConcurrentHashMap?

Java7


versión Java7 usando una cerradura separada (segmento) es en realidad un bloqueo de re-entrada (RetrantLock) para asegurar el hilo de seguridad;
el número de segmento es decisión concurrentLevel, el valor por defecto es 16;


la expansión de la expansión es el momento para un solo segmento, la operación de escritura también, modificar los datos cuando la pieza de bloqueo, es más eficiente;

pero ir tras el tamaño puede no ser exacta.

Una estructura de datos como se muestra a continuación:

image.png

java8


java8 el segmento permanece, pero no actúa sobre la estructura, funciones sólo para asegurar la compatibilidad de la secuencia.

Internos para asegurar la visibilidad de la de almacenamiento de datos volátil;

una operación de CAS, el funcionamiento concurrente libre de bloqueo en una escena específica, la cerradura interior en realidad se utiliza sincronizada;

porque en jdk8, el rendimiento sincronizada ha sido optimizado, y reentrada comparación cerradura puede reducir el consumo de memoria.

Ver Código:


final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException();
    int hash = spread(key.hashCode());
    int binCount = 0;
    for (Node<K,V>[] tab = table;;) {
        Node<K,V> f; int n, i, fh; K fk; V fv;
        if (tab == null || (n = tab.length) == 0)
            tab = initTable();
        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
            // 利用CAS去进行无锁线程安全操作,如果bin是空的
            if (casTabAt(tab, i, null, new Node<K,V>(hash, key, value)))
                break; 
        }
        else if ((fh = f.hash) == MOVED)
            tab = helpTransfer(tab, f);
        else if (onlyIfAbsent // 不加锁,进行检查
                 && fh == hash
                 && ((fk = f.key) == key || (fk != null && key.equals(fk)))
                 && (fv = f.val) != null)
            return fv;
        else {
            V oldVal = null;
            synchronized (f) {
                   // 细粒度的同步修改操作... 
                }
            }
            // Bin超过阈值,进行树化
            if (binCount != 0) {
                if (binCount >= TREEIFY_THRESHOLD)
                    treeifyBin(tab, i);
                if (oldVal != null)
                    return oldVal;
                break;
            }
        }
    }
    addCount(1L, binCount);
    return null;
}

resumen


Esta sección responde a la java clasificación contenedores concurrentes proporcionan, y ConcurrentHashMap en Java7, java8 es cómo asegurar thread-safe.

Me gustaría preguntar a los entrevistadores cerraduras independientes, a pintar a la estructura de datos para borrar.

image.png

El original no es fácil, por favor indique la fuente, nos dejó la complementariedad y el progreso común, la bienvenida a la comunicación múltiple

Publicados 110 artículos originales · ganado elogios 10 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/tian583391571/article/details/105100258
Recomendado
Clasificación