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

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

可以在沒有迭代的情況下獲取、放置和刪除 HashMap 中的 elemetn

可以在沒有迭代的情況下獲取、放置和刪除 HashMap 中的 elemetn

江戶川亂折騰 2021-09-03 16:19:23
我有一個靜態 hashMap,與多個線程共享。我根本沒有迭代地圖,而只是使用get, put, remove。安全ConcurrentModificationException嗎?該方法看起來像這樣private static Map<Long, Integer> TRACKER = new HashMap<Long,Integer>();public static void track(Long tid, boolean b) {        if (b) {            if (TRACKER.containsKey(tid)) {                TRACKER.put(tid, TRACKER.get(tid) + 1);            } else {                TRACKER.put(tid, 1);            }        } else {            Integer n = TRACKER.get(tid);            if (n != null) {                n = n -1;                if (n == 0) {                    TRACKER.remove(tid);                } else {                    TRACKER.put(tid, n);                }            }        }    }
查看完整描述

2 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

安全ConcurrentModificationException嗎?

它是安全的ConcurrentModificationException。該異常僅由使用傳統迭代器或拆分器迭代(在某種意義上)地圖或其視圖之一的方法拋出。

但是,由于HashMap它不是線程安全的類,如果在沒有適當外部外部同步的情況下從多個線程使用它,可能會發生不好的事情。這些包括(按不良程度增加的順序)

  1. size()報告錯誤值的方法。

  2. 條目神秘地暫時或永久消失。

  3. 可能的 NPE 和其他未經檢查的異常。

  4. 由于多個線程在哈希鏈中創建循環的不幸操作序列,可能導致無限循環。

您的示例代碼不安全……但您不會得到“快速失敗” ConcurrentModificationException。相反,您可能會在難以重現的“隨機”時間出現莫名其妙的錯誤。


查看完整回答
反對 回復 2021-09-03
?
蕭十郎

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

如果多個線程在 a上執行getput&remove操作HashMap,沒有適當的同步,一些不好的事情,比如 size() 報告丟失/丟失的條目,意外的 NPE ......甚至可能會發生無限循環。

HashMap文檔說 -

請注意,此實現不是同步的。如果多個線程并發訪問一個散列映射,并且至少有一個線程在結構上修改了映射,則必須在外部進行同步。(結構修改是添加或刪除一個或多個映射的任何操作;僅更改與實例已包含的鍵關聯的值不是結構修改。)...

謝謝斯蒂芬。


查看完整回答
反對 回復 2021-09-03
  • 2 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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