Java 11 hashmap 死锁

Java 11 hashmap deadlock

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

响应是一个非常简单的实体class。

dealock

Response.java

Java11实现没有引入线程安全实现java.util.HashMap.

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

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

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

此外,请记住,在键集或值集上隐式或显式提供的迭代器也是“快速失败”的,这意味着它在迭代它们时立即抛出 ConcurrentModificationException 并且映射得到未使用迭代器本身的特定 addremove 方法进行修改。

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

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

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