gpt4 book ai didi

java - ConcurrentHashMap 中的活锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:17 24 4
gpt4 key购买 nike

当用于计算的函数在同一映射上调用#computeIfAbsent 时,我在并发 HashMap #computeIfAbsent 中遇到了实时锁定条件。

概念上的调用调用如下所示

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

(在计算之间消耗了大约 3 毫秒的 CPU)。不幸的是,我无法想出好的单元测试来始终如一地重现问题。

但是

如果计算函数试图删除调用它的键,还有另一个活锁可能会提供一些线索:

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

虽然第二个示例相当复杂地使用并发 HashMap ,但它会产生与第一个活锁相同的堆栈跟踪,因此可能会有所帮助。

任何帮助将不胜感激!

最佳答案

ConcurrentHashMap.computeIfAbsent文件明确说:

Some attempted update operations on this map by other threads may be blocked while computation is in progress, so the computation should be short and simple, and must not attempt to update any other mappings of this map.

强调我的。在内部 computeIfAbsent 同步包含您的 key 的哈希表条目。当您修改另一个恰好与当前正在处理的条目相同的 key 时,您可能会遇到意外锁定。

一般来说,您应该避免此类修改。不幸的是,您没有为您的问题提供足够的上下文,所以我无法提出替代解决方案。

关于java - ConcurrentHashMap 中的活锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32678692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com