簡體   English   中英

ConcurrentHashMap 中的鍵級鎖定

[英]Key level locking in ConcurrentHashMap

我了解ConcurrentHashMap使用存儲桶級別鎖定,而不是在修改操作時鎖定整個地圖對象。 這允許嘗試修改不同存儲桶中的鍵的兩個線程同時進行修改。 但是如果線程試圖修改同一個桶中的兩個不同的鍵,那么一次只允許一個。

我想了解,實現密鑰級別鎖定的挑戰是什么,其中始終允許同時修改嘗試修改不同密鑰的線程。 SQL DB 實現行級鎖定。 他們如何能夠有效地做到這一點? 將 ConcurrentHashMap 中的鎖/並發級別數量從默認值(我相信是 16)增加到更高數量的成本是多少?

操作鎖定一切

即使您鎖定了存儲桶,您可能仍然需要鎖定整個數據結構的操作。 例如,您可能需要調整Map的大小,這需要您在重新創建數據結構之前鎖定整個數據結構(或所有存儲桶)。

獲取多個鎖

除此之外,在鎖定存儲桶而不是整個數據結構時,您甚至可能會獲得更差的性能。 例如,您可能有頻繁的操作需要獲取多個鎖(例如,遍歷整個數據結構需要確保同時沒有任何內容寫入其中的任何部分)。 需要檢查多個鎖是一種性能成本,它會隨着要檢查的鎖的數量而增加。

當同時獲取多個鎖時,您也可能會遇到死鎖。

鎖不是免費的

此外,鎖是昂貴的。 它們需要額外的內存。 如果你有很多很多的桶,你也需要很多鎖,這些鎖會累積起來。你擁有的鎖越多,情況就越糟。

錯誤的實現

最后,它會使您的實現復雜化並且容易出錯,因為您可能會引入難以調試的邏輯錯誤。 雖然ConcurrentHashMap可能沒有這些錯誤,但您自己的實現可能。

最后的筆記

請注意,這些事情因應用程序而異/取決於您的用例。 如果您更改任何內容以獲得更好的性能/並發性,請在更改前后檢查並驗證它是否變得更好。

如果您的數據結構(或您需要鎖定的任何東西)不經常爭用,那么使用單個鎖可能會更好。 只有當您對來自不同線程的不同存儲桶進行頻繁的並發操作時,存儲桶鎖才有用。

免責聲明:這只是我想出的,可能還有其他問題/困難。

暫無
暫無

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

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