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

membalas semua(3)
迷茫
e.hash == hash && key.equals(e.key)

Ayat sebelumnya menunjukkan bahawa terdapat key ini dalam jadual. Lihat kaedah put Apabila value ialah null, pengecualian akan dilemparkan:

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);
    }

Ini adalah versi saya yang lebih tinggi. Ia mungkin berbeza daripada anda, tetapi nilainya tidak boleh kosong.
Jadi:

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

Kalau tak kosong boleh dipulangkan terus Kalau kosong maknanya thread lain sedang beroperasi. Jadi saya menambahnya.

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;
    }

Versi semasa kaedah get berubah HashEntry<K,V> e menjadi UNSAFE.getObjectVolatile() untuk mendapatkannya, seperti volatile

阿神

Poster boleh meningkatkan JDK yang saya gunakan 1.8 untuk mencari, tetapi saya tidak menemui kod ini dalam ConcurrentHashMap.

刘奇

Objek adalah batal apabila ia dimulakan Nol ini tidak ditetapkan secara khusus dalam program.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan