java - concurrentHashMap源码中的readValueUnderLock(e)存在的意义?
巴扎黑
巴扎黑 2017-04-18 10:04:43
0
3
888
巴扎黑
巴扎黑

répondre à tous(3)
迷茫
e.hash == hash && key.equals(e.key)

La phrase précédente montre qu'il y a ceci key dans le tableau. Regardez la méthode put Lorsque value est null, une exception sera levée :

.
public V put(K key, V value) {
        Segment<K,V> s;
        if (value == null)
            throw new NullPointerException();
        int hash = hash(key);
        int j = (hash >>> segmentShift) & segmentMask;
        if ((s = (Segment<K,V>)UNSAFE.getObject          // nonvolatile; recheck
             (segments, (j << SSHIFT) + SBASE)) == null) //  in ensureSegment
            s = ensureSegment(j);
        return s.put(key, hash, value, false);
    }

Il s'agit d'une version supérieure de la mienne. Elle peut être différente de la vôtre, mais la valeur ne peut pas être vide.
Donc :

if (v != null)
    return v;
return readValueUnderLock(e); // recheck

S'il n'est pas vide, il peut être renvoyé directement. S'il est vide, cela signifie que d'autres threads l'exploitent. Alors je l'ai ajouté.

public V get(Object key) {
        Segment<K,V> s; // manually integrate access methods to reduce overhead
        HashEntry<K,V>[] tab;
        int h = hash(key);
        long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;
        if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null &&
            (tab = s.table) != null) {
            for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile
                     (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE);
                 e != null; e = e.next) {
                K k;
                if ((k = e.key) == key || (e.hash == h && key.equals(k)))
                    return e.value;
            }
        }
        return null;
    }

La version actuelle de la méthode get se transforme HashEntry<K,V> e en UNSAFE.getObjectVolatile() pour l'obtenir, comme celle de volatile

阿神

L'affiche peut mettre à jour le JDK. J'ai utilisé 1.8 pour rechercher, mais je n'ai pas trouvé ce code dans ConcurrentHashMap.

刘奇

L'objet est nul lorsqu'il est initialisé. Ce nul n'est pas attribué spécifiquement dans le programme.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal