我有一个HashMap
,许多线程同时读写。
这会导致死锁吗?
答案 0 :(得分:4)
仅当您使用多个锁并且未按正确顺序锁定/解锁时才会发生死锁。如果您只使用一个(正确使用的)锁定保护HashMap
(或根本不保护),则不会发生死锁。
请注意,标准HashMap
本身不受任何保护,因此只有您的锁定代码(您尚未发布)才会导致死锁。
答案 1 :(得分:2)
hashmap本身不会进行任何锁定。然而,从多个线程读取和修改相同映射的任何正确代码都必须使用锁。一旦锁定进入图片,就有可能发生死锁。
如果不知道有多少锁,以及如何使用这些锁,就无法确定是否存在死锁。
答案 2 :(得分:2)
我看到HashMap
在同时修改时会进入无限循环。它与死锁(或活锁)无关,但它是由遍历损坏的数据结构引起的。
当一个存储桶转换为TreeNode时会发生这种情况,因为遍历树的代码不会保护自己免受损坏的引用。
您通常会看到一个线程在putTreeVal
或类似位置停留的堆栈跟踪。
答案 3 :(得分:1)
死锁是指两名演员锁定并互相等待资源。
当然,使用HashMap时可能会发生死锁。但是死锁是由使用HashMap的代码完成的。
检查你的代码,我的答案就在其中。
答案 4 :(得分:1)
HashMap
不是线程安全的,不会进行任何锁定。所以,你不会遇到死锁,但是你可能也得不到你想要的东西。事实证明,你可能最终陷入无限循环,但你可能在测试中没有发现它。
java.util.concurrent.ConcurrentHashMap
是线程安全的并且提供了良好的性能。但是,多线程还有很多。
答案 5 :(得分:1)
使用未经修饰的HashMap
无法实现死锁。 <{1}}类没有锁定,因此没有机会发生死锁。
但是,如果您使用HashMap
来包装Collections.synchronizedMap(...)
并将其与其他锁定结合使用,则可能会出现死锁...如果不同的线程获取了对象中的锁定不同的顺序。
显然,访问相同HashMap
(不是线程安全的)的多个线程是危险的。实际上,一个线程可能可能可以看到HashMap
的不一致状态,导致它进入无限循环;例如陷入其中一个哈希链的明显周期。这似乎不太可能,但是为了确保不可能你需要对代码进行彻底的分析,同时考虑到多线程在没有同步的情况下进入数据结构所导致的内存异常。
答案 6 :(得分:0)
HashMap
未同步,所以是的,您可能会遇到麻烦。我不确定是否特意死锁 - 我想这将取决于实现,但最终可能会丢失信息。
另一方面,Hashtable
是同步的,应该是线程安全的。
答案 7 :(得分:-1)
你是真的意味着僵局还是无休止的循环?在mutithreaded环境中使用未同步的HashMap
时,多个修改可以创建内部破坏的哈希映射结构。使用Collections.synchronizedMap()
来避免这种情况。
答案 8 :(得分:-1)
HashMap
不是线程安全的。要使HashMap
线程安全,请使用Collections.synchronizedMap()
方法。
HashMap<K, V> map = Collections.synchronizedMap(new HashMap<K, V>());