Java Concurrentmodificationexception異常原因和解決方法


問題: 
在對集合迭代的時候,如果同時對其進行修改就會拋出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等集合類都存在上述問題,請大家在編碼時謹慎使用。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM