gpt4 book ai didi

java - HashMap在并发访问中挂起

转载 作者:行者123 更新时间:2023-11-30 07:13:47 25 4
gpt4 key购买 nike

我们有一个使用 java.util.HashMap 实例的应用程序,该实例通过各种间接方式进行共享,以便多个线程同时访问它。我们现在已经修复了这个问题,因为我们知道 java.util.HashMap 不是线程安全的,不应该同时访问。

在该修复之前,以及我们发现的原因,我们升级了 JDK(到 IBM JDK 7 SR3),并且在升级之后,我们在该 HashMap 实例的获取操作期间遇到了偶尔挂起的情况(挂起发生在 getEntry() 方法中。)

出于好奇,我想知道 HashMap 内部发生了什么,导致了挂起。影响并发访问行为的实现有何不同?

关于它出现的 HashMap 实现,IBM JDK 与 Oracle JDK 和 OpenJDK 相同,这又与 Java8 版本不同(使用 Node 数据结构)。

我相信,difference between java7u40 b43 vs b147代表升级中引入的更改。

我目前的假设是,挂起的原因与 addEntry 方法的更改有关,从 add-first-resize-after 更改为 先调整大小再添加

但是有谁确切的了解,并发访问时到底发生了什么?

最佳答案

当调用hashmap.put(key, value)时,会检查HashMap阈值。如果映射大小超过此阈值,映射将被调整大小,并且所有条目将被重新散列。
在多线程环境中,这将使 HashMap 处于不一致的状态。至少,您应该通过使用同步或锁来保护应用程序中写入 HashMap 的调用。
我建议使用 java.util.concurrent.ConcurrentHashMap。

关于java - HashMap在并发访问中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38761222/

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