Una confusión sobre el código fuente del método putVal de ConcurrentHashMap

Aquí hay parte de los códigos para el putValmétodo:

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;
        if (tab == null || (n = tab.length) == 0)
            tab = initTable();  // lazy Initialization
        //step1,tabAt(...) is CAS
        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
            //step2,casTabAt(...) is CAS
            if (casTabAt(tab, i, null,
                         new Node<K,V>(hash, key, value, null)))
                break;                   // no lock when adding to empty bin
        }
       ...
    return null;
}  

Supongamos que actualmente hay dos subprocesos Ay B, cuando se Aejecuta step1, se obtiene true, pero al mismo tiempo Btambién se ejecuta step1y se obtiene true. Y ambos Ay Bejecutar step2.

ingrese la descripción de la imagen aquí

de esta situación, B'es Nodesustituir a los A' s Node, o dicho Ade datos 's se sustituye por B, esto es de mal.

No sé si es correcto o incorrecto, ¿alguien puede ayudarme a resolverlo?

Respuesta 1

Estoy usando log4j para enviar un correo electrónico cuando hay una excepción. a continuación se muestra mi configuración de archivo de propiedades log4j. log4j.rootLogger = WARN, R, correo electrónico log4j.appender.R = org.apache.log4j.ConsoleAppender log4j ....

Al leer el código fuente de Java Hashtable, noté que el campo de recuento de Hashtable no se inicializa cuando declaro que veo que en el método readObject existe este código: count = 0; Cuando es el ...

Hola, estoy usando GWT para enviar un archivo usando un servlet. Inicialmente intentaba enviar solo un archivo al servidor. Eso estaba funcionando bien. Ahora en af ​​ormPanel agregué 3 Listbox. listBox privado propertyNamelist = ...

Estoy usando Oracle 12g y estoy tratando de obtener un ResultSet de un SYS_REFCURSOR. Tengo un procedimiento con la siguiente firma: CREAR O REEMPLAZAR PROCEDIMIENTO proc_search (usuario IN VARCHAR2, res OUT ...