問題:在對集合迭代的時候,如果同時對其進行修改就會拋出java.util.ConcurrentModificationException異常;
原因分析:進入報錯信息,定位LinkedHashMap719行, modCount != expectedModCount 拋異常。modCount是HashMap類中的一個成員變量,表示對Map的修改次數,每次調用put()方法或者remove()方法就會對modCount進行加1操作;
expectedModCount:表示對Map修改次數的期望值,它的初始值為modCount
當對圖一中的processes進行遍歷的時候,modCount == expectedModCount;
1. 循環開始,由於modCount和expectedModCount相等,第一次循環獲取了對象Entry
2. 進入循環體后,processes.remove(pid)方法實際上調用了父類HashMap的removeNode方法,最后++modCount,而expectedModCount不變3. 繼續循環,在nextNode()方法中,由於modCount != expectedModCount,報 ConcurrentModificationException異常!解決方案:單線程:使用迭代器,通過迭代器進行刪除。
為什么使用迭代器刪除不會報錯?因為迭代器用了自己封裝的remove方法,最后一步多了一個操作 expectedModCount = modCount
多線程:可以使用CopyOnWriteArrayList,ConcurrentHasMap等List和Map等集合類都存在上述問題,請大家在編碼時謹慎使用。