[英]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.