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