2011-12-22 107 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或類似的地方。