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");}}}}