1. 程式人生 > >Java原始碼分析——ConcurrentHashMap

Java原始碼分析——ConcurrentHashMap

HashMap在高併發情況下新增值容易出現環形鏈,不能保證資料的安全性,所以ConcurrentHashMap作為替代方式出現了,concurrentHashmap比hashtable更加高效,因為hashtable是將整個物件鎖住,當一個執行緒在操作時,其它執行緒不能有任何操作。


要理解它只需要理解一個重要的概念segment。每一個segment相當於一個hashmap,有2的N次方多個,儲存在segments陣列中,所以可以這樣認為concurrenthashmap是一個二維雜湊表,在一個hash表中每一個元素又是一個hash表,不同的segments是可以併發操作的,同一個segmen一個執行緒讀和一個執行緒寫也是可以的,但是同一個segment一個執行緒寫,另一個執行緒也寫是不行的。
get()方法是不加鎖的,具體思路如下:

  1. 根據key的hashCode()方法得到hash值
  2. 根據這個hash值定位到segment物件
  3. 再次根據hash值定位到segment物件陣列中具體位置

put方法是加鎖的
1.根據key的hashCode()方法得到hash值
2.通過hash值,定位到對應的Segment物件
3.synchronized獲取可重入鎖
4.再次通過hash值,定位到Segment當中陣列的具體位置。
5.插入或覆蓋物件。
6.釋放鎖。