Java 多線程導致的List集合迭代異常ConcurrentModificationException 和 ArrayIndexOutOfBoundsException 異常

最近項目中發現一個特別奇怪的問題,具體錯誤信息:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.next(ArrayList.java:857)
    at com.dhgate.mobile.wap.TestJedisUtil.main(TestJedisUtil.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

 

代碼如下:

想不明白for循環爲什麼會報次異常。

定位到錯誤位置發現,當下標位置小於集合大小時拋出此異常,但是程序中並沒有刪除之類的邏輯處理,這是爲什麼呢?

經過進一步的代碼跟蹤發現,原來是因爲ArrayList並不是線程安全的集合,在多線程情況下執行addAll可能會導致集合大小出現錯誤,並在執行迭代器循環時出現ConcurrentModificationException 並可能出現ArrayIndexOutOfBoundsException。改用線程安全的集合即可避免此問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章