当用于计算的函数在同一个映射上调用 #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"));
虽然第二个示例是并发哈希映射的使用相当复杂,但它会产生与第一个活锁相同的堆栈跟踪,因此可能会有所帮助。
任何帮助将不胜感激!