3 回答

TA貢獻1789條經驗 獲得超8個贊
如果您這樣做的原因是跟蹤線程完成情況,為什么不使用 CountdownLatch?不確定 HashMap 是否只能在刪除時出現并發問題,我建議僅當您的代碼不會因任何可能的問題而中斷時才使用它,或者使用 ConcurrentHashMap。

TA貢獻1828條經驗 獲得超13個贊
javadoc說HashMap
:
請注意,此實現不是同步的。
如果多個線程同時訪問哈希圖,并且至少有一個線程在結構上修改了該圖,則必須進行外部同步。(結構修改是添加或刪除一個或多個映射的任何操作;僅更改與實例已包含的鍵關聯的值不是結構修改。)這通常是通過在自然封裝映射的某個對象上進行同步來完成的。
上面提到,刪除是一個結構性的改變,必須使用同步。
再者,在removeNode()
Hashmap的方法中(方法調用的remove()
),modCount
變量是遞增的,它負責ConcurrentModificationException
.?因此,如果在沒有同步的情況下刪除元素,您可能會遇到此異常。
因此您必須使用ConcurrentHashMap
.

TA貢獻1873條經驗 獲得超9個贊
您詢問了HashMap
和之間的差異ConcurrentHashMap
,但還需要考慮一個額外的數據結構:Hashtable
。每一個都存在差異和權衡。您需要評估哪一個最適合您的預期用途。
HashMap
是不同步的,因此如果多個線程可以讀取或寫入它,您的結果將是不可預測的。HashMap
還允許 null 作為鍵或值。Hashtable
是同步的,不支持空鍵或值。來自哈希表 Javadoc:哈希表是同步的。如果不需要線程安全的實現,建議使用HashMap代替Hashtable。如果需要線程安全的高并發實現,那么建議使用ConcurrentHashMap代替Hashtable。
ConcurrentHashMap
是線程安全的,不允許使用 null 作為鍵或值。
添加回答
舉報