1:ConcurrentHashMap采用了分段鎖的設(shè)計(jì),只有在同一個(gè)分段內(nèi)才存在競(jìng)態(tài)關(guān)系,不同的分段鎖之間沒有鎖競(jìng)爭(zhēng)
ConcurrentHashMap中的分段鎖稱為Segment,它即類似于HashMap(JDK7與JDK8中HashMap的實(shí)現(xiàn))的結(jié)構(gòu),即內(nèi)部擁有一個(gè)Entry數(shù)組,數(shù)組中的每個(gè)元素又是一個(gè)鏈表;同時(shí)又是一個(gè)ReentrantLock(Segment繼承了ReentrantLock)。ConcurrentHashMap中的HashEntry相對(duì)于HashMap中的Entry有一定的差異性:HashEntry中的value以及next都被volatile修飾,這樣在多線程讀寫過程中能夠保持它們的可見性,代碼如下:
| 12345 | staticfinal class HashEntry<K,V> { finalint hash; finalK key; volatileV value; volatileHashEntry<K,V> next; |
2:ConcurrentHashMap的key和value都不允許為空,這一點(diǎn)和HashTable一致,和HashMap不同,當(dāng)你put(put(key,value))其中一個(gè)為null的時(shí)候,會(huì)返回一個(gè) java.lang.NullPointerException這個(gè)錯(cuò)誤,查看源碼可以看到
@Override public Object put(String key, Object value) { if (null == key || null == value) { throw new NullPointerException(); } validateKey(key); return super.put(key, value); }
需要了解具體的原理實(shí)現(xiàn),可以查看 http://blog.csdn.net/liuzhengkang/article/details/2916620,寫的很詳細(xì)的
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注