ConcurrentModificationException產生原因及解決方法

大家應該都知道, 在java中, 在對一些集合迭代的過程中對集合進行一些修改的操作, 比如說add,remove之類的操作, 搞不好就會拋ConcurrentModificationException.

在單線程操作的情況下,在DAO層查詢到數據集合後,返回到service層做業務處理,要求:遍歷數據集合,判斷不符合條件的元素,做刪除操作。

在用foreach和 Iterator 都會發生java.util.ConcurrentModificationException。

迭代器的modCount和expectedModCount的值不一致。

單線程中該異常出現的原因是:對一個集合遍歷的同時,有對該集合進行了增刪的操作。導致AbstarctList的modCount和expectedModCount的值不一致。

而我們要做的就是將需要操作的元素放到中間元素中,並記錄操作標誌位。在遍歷結束後進行增刪操作。

或自定義迭代器複寫其中的相關操作,在操作結束後添加expectedModCount = modCount;

多線程中更容易出現該異常,當你在一個線程中對一數據集合進行遍歷,正趕上另外一個線程對該數據集合進行增刪操作。

解決方案:
1)在使用iterator迭代的時候使用synchronized或者Lock進行同步;

2)使用併發容器CopyOnWriteArrayList代替ArrayList和Vector。


發佈了16 篇原創文章 · 獲贊 36 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章