簡體   English   中英

ConcurrentHashMap鎖定

[英]ConcurrentHashMap locking

我在某地讀過,在ConcurrentHashMap ,整個地圖對象沒有被鎖定,而是在Map的一部分上進行鎖定。

有人可以詳細說明何時鎖定進入圖片?

是否正確讀取Map時沒有涉及到鎖定,但在更新時只使用鎖定?

是的, ConcurrentHashMap使用多個鎖(默認情況下,其中有16個),每個鎖控制一個哈希段。

在特定段中設置數據時,將獲取該段的鎖定。

獲取數據時,使用易失性讀取。 如果易失性讀取導致未命中,則獲得該段的鎖定以用於成功讀取的最后一次嘗試。

鎖定盡可能地最小化,同時仍然是線程安全的。

為了解釋“部分地圖被鎖定”,這意味着在更新時,僅鎖定地圖的“1 / concurrencyLevel”(基於密鑰的散列)。 這意味着如果兩個更新各自影響單獨的“存儲桶”,則它們仍然可以同時安全地執行,從而最大限度地減少鎖爭用並最大限度地提高性能。

更重要的是,相信JDK實現 - 您不必擔心JDK中的實現細節(一方面,它可能會在發行版之間發生變化)。 相反,只是專注於編寫代碼

ConcurrentHashMap使用Reentrant Lock機制。 ConcurrentHashMap使用段而不是存儲桶,當新記錄獲取插入鎖定時,將只獲取段而不是完整的段列表。 所以這里的想法清楚地表明,多級鎖定將獲得同樣的收益。

由於沒有設置並發級別,因此ConcurrentHashMap被分為16個段。 每個段都充當獨立的HashMap。

ConcurrentHashMap中的讀取操作沒有應用鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM