Java11哈希映射死锁
下面是我编写的几行代码,用于在多线程环境中测试hashmap的性能。我知道hashmap可能会导致java8死锁,但我使用的是Java11。它不会抛出任何异常,也不会停止。有人能帮我理解为什么吗?多谢各位 Response是一个非常简单的实体类Java11哈希映射死锁,java,multithreading,hashmap,Java,Multithreading,Hashmap,下面是我编写的几行代码,用于在多线程环境中测试hashmap的性能。我知道hashmap可能会导致java8死锁,但我使用的是Java11。它不会抛出任何异常,也不会停止。有人能帮我理解为什么吗?多谢各位 Response是一个非常简单的实体类 Java11实现没有引入Java.util.HashMap的线程安全实现 在JDK文档中,明确指出对Hashmap的访问是不同步的,因此多线程应用程序中的行为是不可预测的,死锁情况确实是一种可能的副作用 另外,也有人说,如果您想进行同步访问,必须使用静
Java11实现没有引入
Java.util.HashMap
的线程安全实现
在JDK文档中,明确指出对Hashmap
的访问是不同步的,因此多线程应用程序中的行为是不可预测的,死锁情况确实是一种可能的副作用
另外,也有人说,如果您想进行同步访问,必须使用静态方法Collections提供同步策略。synchronizedMap
,这段代码实现了:
Map m = Collections.synchronizedMap(new HashMap(...));
此外,请记住,在键集或值集上隐式或显式提供的迭代器也是“fail fast”,这意味着在遍历它们时,它会立即抛出一个ConcurrentModificationException
,并且映射会在不使用迭代器本身的特定add
或remove
方法的情况下被修改
如果您希望获得更好的性能,特别是想要避免任何竞争条件,您可以选择使用java.util.concurrent.ConcurrentHashMap
,这保证不会抛出任何ConcurrentModificationException
在这种情况下,您也可以简单地用并发映射的实例包装映射,因此给定K
和V
键和值的类型:
Map<K,V> m = new ConcurrentHashMap<>(myHashMap);
Map m=新的ConcurrentHashMap(myHashMap);
请在问题中加入代码;不要通过外部链接提供。问题应该是自包含的。HashMap不是线程安全的,为什么您希望程序能够正确运行?