java - ConcurrentHashMap 中的死锁

标签 java concurrenthashmap

运行时跟随代码,永远不会终止并陷入无限循环。

我不确定它卡在哪里。

有趣的是,当我将 AaAa 更改为 AAAA 时,一切都按预期正常工作。

 public class Test {

    public static void main(String[] args) {

        Map<String, Integer> map = new ConcurrentHashMap<>(16);
        map.computeIfAbsent(
                "AaAa",
                key -> {
                    return map.computeIfAbsent(
                            "BBBB",
                            key2 -> 42);
                }
        );
    }

}

谁能帮我理解这种行为。

最佳答案

"AaAa""BBBB" 具有相同的 hashCode() - 2031744。 因此,这两个键都映射到 Map 的同一个 bin。

外部 map.computeIfAbsent 锁定那个 bin,而内部 map.computeIfAbsent 试图在释放锁之前锁定它 - 因此出现死锁。

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

相关文章:

java - 用 Java 绘图

java - 性能: ArrayList or ConcurrentHashMap

java - Android 应用程序错误 : net. wimpi.modbus.ModbusSlaveException:错误代码 = 2

java - 如何从Impala数据库将字符串数据导入到wordcount mapreduce

java - ArrayList放入j.u.c.ConcurrentHashMap后会安全发布吗?

java - 如何制作绩效数字的直方图

java - java.util.concurrent.ConcurrentHashMap.putIfAbsent 是否需要在同步块(synchronized block)中?

java - 如何解决对 java.util.concurrent.ConcurrentHashMap 的 findbug 调用序列可能不是原子的

java - 无法从 Weblogic Server 10.3.6 生成 JFR 报告

java - 我的 Jlists 没有发生滚动