亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 并發:當并發線程僅刪除元素時,HashMap 與 ConcurrentHashMap

Java 并發:當并發線程僅刪除元素時,HashMap 與 ConcurrentHashMap

叮當貓咪 2023-08-23 11:38:07
我有一個主線程,它創建一個 HashMap,向其中添加多個可運行對象,然后啟動每個可運行對象(將 HashMap 傳遞給每個對象)??蛇\行對象在即將完成處理之前從映射中刪除其對象。我想知道在這種情況下是否有任何理由使用 ConcurrentHashMap (而不是 HashMap) - 可運行對象在地圖上執行的唯一操作就是將自己從中刪除。在這種情況下是否需要考慮并發性而需要使用 ConcurrentHashMap?主線程private final Map<Integer, Consumer> runnableMap = new HashMap<>();Runnable runnable;for (int i = 1; i <= NUM_RUNNABLES; i++) {    runnable = new Consumer(i, runnableMap);    runnableMap.put(i, runnable);    executionContext.execute(runnable);}消費者實現Runnableprivate final Integer consumerNumber;private final Map<Integer, Consumer> runnableMap;public Consumer(int consumerNumber, final Map<Integer, Consumer> runnableMap){    this.consumerNumber = consumerNumber;    this.runnableMap = runnableMap;}public void run() {    :::    // business logic    :::    // Below remove is the only operation this thread executes on the map    runnableMap.remove(consumerNumber);}
查看完整描述

3 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

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



查看完整回答
反對 回復 2023-08-23
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

javadoc說HashMap


請注意,此實現不是同步的。

如果多個線程同時訪問哈希圖,并且至少有一個線程在結構上修改了該圖,則必須進行外部同步。(結構修改是添加或刪除一個或多個映射的任何操作;僅更改與實例已包含的鍵關聯的值不是結構修改。)這通常是通過在自然封裝映射的某個對象上進行同步來完成的。

上面提到,刪除是一個結構性的改變,必須使用同步。

再者,在removeNode()Hashmap的方法中(方法調用的remove()),modCount變量是遞增的,它負責ConcurrentModificationException.?因此,如果在沒有同步的情況下刪除元素,您可能會遇到此異常。

因此您必須使用ConcurrentHashMap.


查看完整回答
反對 回復 2023-08-23
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

您詢問了HashMap和之間的差異ConcurrentHashMap,但還需要考慮一個額外的數據結構:Hashtable。每一個都存在差異和權衡。您需要評估哪一個最適合您的預期用途。

  • HashMap是不同步的,因此如果多個線程可以讀取或寫入它,您的結果將是不可預測的。HashMap還允許 null 作為鍵或值。

  • Hashtable是同步的,不支持空鍵或值。來自哈希表 Javadoc:

    哈希表是同步的。如果不需要線程安全的實現,建議使用HashMap代替Hashtable。如果需要線程安全的高并發實現,那么建議使用ConcurrentHashMap代替Hashtable。

  • ConcurrentHashMap是線程安全的,不允許使用 null 作為鍵或值。


查看完整回答
反對 回復 2023-08-23
  • 3 回答
  • 0 關注
  • 296 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號