我有一個靜態 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
它不是線程安全的類,如果在沒有適當外部外部同步的情況下從多個線程使用它,可能會發生不好的事情。這些包括(按不良程度增加的順序)
size()
報告錯誤值的方法。條目神秘地暫時或永久消失。
可能的 NPE 和其他未經檢查的異常。
由于多個線程在哈希鏈中創建循環的不幸操作序列,可能導致無限循環。
您的示例代碼不安全……但您不會得到“快速失敗” ConcurrentModificationException
。相反,您可能會在難以重現的“隨機”時間出現莫名其妙的錯誤。
添加回答
舉報
0/150
提交
取消