【问题标题】:Java 11 hashmap deadlock [closed]Java 11 哈希映射死锁 [关闭]
【发布时间】:2021-04-27 20:17:30
【问题描述】:

这是我编写的几行代码,用于测试 hashmap 在多线程环境中的性能。我知道 hashmap 可能会导致 java8 死锁,但我使用的是 java 11。它不会抛出任何异常,而且永远不会停止。有人可以帮我理解为什么吗?谢谢。

Response 是一个非常简单的实体类。

dealock

Response.java

【问题讨论】:

  • 请在问题中包含代码;不要通过外部链接提供它。问题应该是独立的。
  • HashMap 不是线程安全的,你为什么希望你的程序能够正确运行?

标签: java multithreading hashmap


【解决方案1】:

Java 11 实现没有引入java.util.HashMap 的线程安全实现。

在 JDK 文档中,明确指出对 Hashmap 的访问是不同步的,因此多线程应用程序中的行为是不可预测的,死锁情况确实是一种可能的副作用。

另外,据说如果要同步访问,必须通过静态方法Collections.synchronizedMap提供同步策略,这段代码实现:

Map m = Collections.synchronizedMap(new HashMap(...));

此外,请记住,在 keyset 或 valueset 上隐式或显式提供的迭代器也是“快速失败”的,这意味着它在迭代它们时会立即抛出 ConcurrentModificationException 并且在不使用特定的情况下修改映射addremove 迭代器本身的方法。

如果您正在寻找更好的性能,特别是,如果您想避免任何竞争条件,您也可以使用java.util.concurrent.ConcurrentHashMap,这保证不会抛出任何ConcurrentModificationException

在这种情况下,您也可以简单地使用并发实例包装您的地图,因此给定 KV 键和值的类型:

Map<K,V> m = new ConcurrentHashMap<>(myHashMap);

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多