e.hash == hash && key.equals(e.key)
前面這一句說明了表裡有這個key的,你看看put方法,当value为null的時候是會跑出異常的:
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); }
我這是高版的,可能跟你的不一樣,但是也是值也是不能為空的。 所以:
if (v != null) return v; return readValueUnderLock(e); // recheck
不為空可以直接傳回,如果為空則表示有其他執行緒在操作它。所以就加了一句。
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; }
現在版本的get方法把HashEntry<K,V> e弄成UNSAFE.getObjectVolatile()获取,像是volatile的了
get
HashEntry<K,V> e
UNSAFE.getObjectVolatile()
volatile
樓主可以把JDK升級一下,我用的1.8找了一下,没发现这段代码在ConcurrentHashMap中。
1.8
ConcurrentHashMap
物件初始的時候就是null,這個null並不是在程式中刻意賦值的。
前面這一句說明了表裡有這個
key
的,你看看put
方法,当value
为null
的時候是會跑出異常的:我這是高版的,可能跟你的不一樣,但是也是值也是不能為空的。
所以:
不為空可以直接傳回,如果為空則表示有其他執行緒在操作它。所以就加了一句。
現在版本的
get
方法把HashEntry<K,V> e
弄成UNSAFE.getObjectVolatile()
获取,像是volatile
的了樓主可以把JDK升級一下,我用的
1.8
找了一下,没发现这段代码在ConcurrentHashMap
中。物件初始的時候就是null,這個null並不是在程式中刻意賦值的。