2011-12-22 106 views

回答

0

HashMap不同步,所以是的,你可能会遇到麻烦。我不确定是否存在特定的死锁 - 我认为这取决于实施,但最终可能会丢失信息。

另一方面,Hashtable是同步的,应该是线程安全的。

+0

他问起死锁,不是线程安全的。 – Tudor 2011-12-22 14:39:29

+0

有更好的替代方案,以历史性的'Hashtable'为例 – adarshr 2011-12-22 14:41:01

+0

是一个'ConcurrentHashMap'。 – 2011-12-22 14:41:43

1

当2个角色互相锁定并等待资源时,会出现死锁。

当然,使用HashMap时可能会发生死锁。但是,死锁是由使用HashMap的代码完成的。

检查你的代码,我求答案就在其中。

2

哈希映射本身不会做任何锁定。尽管如此,任何从多个线程读取和修改相同映射的正确代码都必须使用锁。一旦锁定进入图片,就有可能发生死锁。

不知道更多关于有多少锁,以及如何使用它们,无法确定死锁是否可能。

4

死锁只有在您使用多个锁并且不以正确顺序锁定/解锁它们时才会发生。如果您仅使用一个(正确使用的)锁(或根本不使用)来保护您的HashMap,则不会发生死锁。

请注意,标准HashMap本身不受任何保护,所以只有您的锁定代码(您没有发布)可能导致死锁。

-1

你真的是指一个僵局或者一个无限循环?在mutithreaded环境中使用未同步的HashMap时,多个修改可以创建内部中断哈希映射结构。使用Collections.synchronizedMap()来避免这种情况。

-1

HashMap不是线程安全的。要使HashMap线程安全,请使用Collections.synchronizedMap()方法。

HashMap<K, V> map = Collections.synchronizedMap(new HashMap<K, V>()); 
1

HashMap不是线程安全的,不会做任何锁定。所以,你不会遇到死锁,但是你可能得不到你想要的。事实证明,你可以在无限循环中结束,但在测试中你可能不会察觉到这一点。

java.util.concurrent.ConcurrentHashMap是线程安全的,并提供良好的性能。但是,多线程还有很多。

+0

我的拇指规则如果你使用''ConcurrentMap'就像普通的'Map'一样(即只有put/get/remove),一定有什么问题。 – bestsss 2011-12-23 01:10:04

1

使用未加工的HashMap不可能发生死锁。 HashMap类没有锁定,所以没有死锁的机会。但是,如果您使用Collections.synchronizedMap(...)来包装HashMap,并且将其与其他锁定结合使用,则可能会发生死锁......如果不同的线程以不同的顺序获取对象上的锁定。

而且很明显,多个线程访问同一个HashMap(这不是线程安全的)非常危险。事实上,可能有可能为一个线程看到HashMap,导致它进入一个无限循环的状态不一致;例如在一个哈希链中出现明显的循环。这似乎不大可能,但要确保不可能需要对代码进行彻底分析,同时考虑到由多个线程触发数据结构而导致的内存异常,而无需同步。

1

我见过HashMap进入无限循环当它被同时修改。它与死锁(或活锁)无关,但它是由遍历损坏的数据结构引起的。

这时候桶被转换成树节点作为遍历树不会保护自己免受破坏的参考代码特别情况。

您通常看到那么踪迹,其中一个线程被卡在putTreeVal或类似的地方。