1. 程式人生 > >ConcurrentHashMap是如何實現多執行緒同步的?

ConcurrentHashMap是如何實現多執行緒同步的?

分析Hashtable就知道,synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨佔;ConcurrentHashMap允許多個執行緒修改操作併發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap 內部使用段(Segment)來表示這些不用的部分,每個段其實就是一個小的hashtable,它們有自己的鎖。只要多個修改操作發生在不用的段上,它們就可以併發進行。有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整張表而不僅僅是某個段。這需要按順序鎖定所有段,操作完畢後,有按順序釋放所有段的鎖。這裡“按順序”很重要,否則極有可能出現死鎖。
下面是ConcurrentHashMap的結構圖:


這裡寫圖片描述