簡體   English   中英

ConcurrentHashMap中的Live Lock

[英]Live Lock in ConcurrentHashMap

當用於計算的函數在同一個地圖上調用#computeIfAbsent時,我在並發hashmap #computeIfAbsent中遇到了實時鎖定條件。

從概念上講,調用調用如下所示

final Map<String, Boolean> map = new ConcurrentHashMap<>();
map.computeIfAbsent("k1", k1 -> map.computeIfAbsent("k2", k2 -> Boolean.TRUE));

(在計算之間燒掉大約3ms的cpu)。 不幸的是,我不能提出良好的單元測試來一致地重現問題。

然而

還有另一個活鎖,如果計算函數試圖刪除它被調用的鍵,它可能會給出一些線索:

 final Map<String, Boolean> map = new ConcurrentHashMap<>();
 map.computeIfAbsent("k", k -> map.remove("k"));

雖然第二個例子是使用並發哈希映射的相當復雜的,但它導致與第一個實時鎖相同的堆棧跟蹤,因此可能會有所幫助。

任何幫助將非常感謝!

那么ConcurrentHashMap.computeIfAbsent文檔明確說:

其他線程在此映射上的某些嘗試更新操作可能在計算進行時被阻止,因此計算應該簡短,並且不得嘗試更新映射任何其他映射

強調我的。 內部computeIfAbsent在包含密鑰的哈希表條目上進行同步。 當您修改恰好與當前正在處理的條目相同的另一個鍵時,您可能會遇到意外鎖定。

一般來說,你應該避免這種修改。 遺憾的是,您沒有為您的問題提供足夠的上下文,因此我無法提出替代解決方案。

暫無
暫無

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

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