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:
key
put
value
null
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
get
HashEntry<K,V> e
UNSAFE.getObjectVolatile()
volatile
Poster boleh meningkatkan JDK yang saya gunakan 1.8 untuk mencari, tetapi saya tidak menemui kod ini dalam ConcurrentHashMap.
1.8
ConcurrentHashMap
Objek adalah batal apabila ia dimulakan Nol ini tidak ditetapkan secara khusus dalam program.
Ayat sebelumnya menunjukkan bahawa terdapat
key
ini dalam jadual. Lihat kaedahput
Apabilavalue
ialahnull
, pengecualian akan dilemparkan:Ini adalah versi saya yang lebih tinggi. Ia mungkin berbeza daripada anda, tetapi nilainya tidak boleh kosong.
Jadi:
Kalau tak kosong boleh dipulangkan terus Kalau kosong maknanya thread lain sedang beroperasi. Jadi saya menambahnya.
Versi semasa kaedah
get
berubahHashEntry<K,V> e
menjadiUNSAFE.getObjectVolatile()
untuk mendapatkannya, sepertivolatile
Poster boleh meningkatkan JDK yang saya gunakan
1.8
untuk mencari, tetapi saya tidak menemui kod ini dalamConcurrentHashMap
.Objek adalah batal apabila ia dimulakan Nol ini tidak ditetapkan secara khusus dalam program.