繁体   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