Java核心知識 多線程併發 ConcurrentHashMap 併發(三十)


Java核心知識 多線程併發 ConcurrentHashMap 併發(三十)

1. 減小鎖粒度

減小鎖粒度是指縮小鎖定對象的範圍,從而減小鎖衝突的可能性,從而提高系統的併發能力。減 小鎖粒度是一種削弱多線程鎖競爭的有效手段,這種技術典型的應用是 ConcurrentHashMap(高 性能的 HashMap)類的實現。對於 HashMap 而言,最重要的兩個方法是 get 與 set 方法,如果我 們對整個 HashMap 加鎖,可以得到線程安全的對象,但是加鎖粒度太大。Segment 的大小也被 稱為 ConcurrentHashMap 的併發度。

2. ConcurrentHashMap 分段鎖

ConcurrentHashMap,它內部細分了若干個小的 HashMap,稱之為段(Segment)。默認情況下 一個 ConcurrentHashMap 被進一步細分為 16 個段,既就是鎖的併發度。

如果需要在 ConcurrentHashMap 中添加一個新的表項,並不是將整個 HashMap 加鎖,而是首 先根據 hashcode 得到該表項應該存放在哪個段中,然後對該段加鎖,並完成 put 操作。在多線程 環境中,如果多個線程同時進行 put 操作,只要被加入的表項不存放在同一個段中,則線程間可以 做到真正的並行。

ConcurrentHashMap 是由 Segment 數組結構和 HashEntry 數組結構組成

ConcurrentHashMap 是由 Segment 數組結構和 HashEntry 數組結構組成。Segment 是一種可 重入鎖 ReentrantLock,在 ConcurrentHashMap 裡扮演鎖的角色,HashEntry 則用於存儲鍵值 對數據。一個 ConcurrentHashMap 裡包含一個 Segment 數組,Segment 的結構和 HashMap 類似,是一種數組和鏈表結構, 一個 Segment 裡包含一個 HashEntry 數組,每個 HashEntry 是 一個鏈表結構的元素, 每個 Segment 守護一個 HashEntry 數組裡的元素,當對 HashEntry 數組的 數據進行修改時,必須首先獲得它對應的 Segment 鎖。


Java核心知識 多線程併發 ConcurrentHashMap 併發(三十)


分享到:


相關文章: