【发布时间】:2015-12-17 04:15:37
【问题描述】:
当用于计算的函数在同一个映射上调用 #computeIfAbsent 时,我在并发哈希映射 #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"));
虽然第二个示例是并发哈希映射的使用相当复杂,但它会产生与第一个活锁相同的堆栈跟踪,因此可能会有所帮助。
任何帮助将不胜感激!
【问题讨论】:
-
Better error handing 在 Doug 的存储库中,但还没有在 JDK 版本中。
标签: java concurrency java.util.concurrent concurrenthashmap livelock