大家應該都知道, 在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。