ConcurrentHashMap是如何實現多線程同步的?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章