ConcurrentModificationException 概述
這個異常在 Java 中通常發生在以下場景:當某個線程在遍歷一個集合(如 ArrayList、HashMap 等)的過程中,另一個線程嘗試修改這個集合的結構(如添加、刪除元素),這時正在遍歷的線程就會拋出 ConcurrentModificationException。
為了避免這個異常,可以使用并發集合類(如 CopyOnWriteArrayList、ConcurrentHashMap 等),或者使用迭代器(Iterator)的 remove() 方法來安全地刪除元素,或者使用并發控制機制(如 synchronized 塊或 Lock)來確保在遍歷過程中集合不會被其他線程修改.
ConcurrentModificationException 復現代碼
package MyList;import java.util.ArrayList;import java.util.Collection;public class MyList {public static void main(String[] args) {Collection<String> myList = new ArrayList<>();myList.add("A");myList.add("B");myList.add("C");//獲取迭代器對象// iterator.hasNext()判斷是否有下一個元素for (String s : myList) {// iterator.next()獲取下一個元素System.out.println(s);if (s.equals("B")) {myList.add("k");}}}}
編譯輸出
ConcurrentModificationException 解決
package MyList;import java.util.ArrayList;import java.util.Collection;import java.util.ListIterator;public class MyList {public static void main(String[] args) {ArrayList<String> myList = new ArrayList<>();myList.add("A");myList.add("B");myList.add("C");//獲取迭代器對象// iterator.hasNext()判斷是否有下一個元素ListIterator<String> iterator = myList.listIterator();while (iterator.hasNext()) {String element = iterator.next();if (element.equals("B")) {iterator.add("F");}}}}