3 回答

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

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

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
您詢問了HashMap
和之間的差異ConcurrentHashMap
,但還需要考慮一個(gè)額外的數(shù)據(jù)結(jié)構(gòu):Hashtable
。每一個(gè)都存在差異和權(quán)衡。您需要評估哪一個(gè)最適合您的預(yù)期用途。
HashMap
是不同步的,因此如果多個(gè)線程可以讀取或?qū)懭胨?,您的結(jié)果將是不可預(yù)測的。HashMap
還允許 null 作為鍵或值。Hashtable
是同步的,不支持空鍵或值。來自哈希表 Javadoc:哈希表是同步的。如果不需要線程安全的實(shí)現(xiàn),建議使用HashMap代替Hashtable。如果需要線程安全的高并發(fā)實(shí)現(xiàn),那么建議使用ConcurrentHashMap代替Hashtable。
ConcurrentHashMap
是線程安全的,不允許使用 null 作為鍵或值。
添加回答
舉報(bào)