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