java.util.ConcurrentModificationException
是 Java 中常见的运行时异常,通常发生在集合对象被多个线程同时修改时,或者在单线程环境中,当一个线程正在遍历集合,而另一个线程尝试修改该集合时。这个异常的主要目的是为了防止不可预知的数据不一致性。
ArrayList
, HashMap
等)采用了快速失败机制,它们在迭代过程中检测到集合被修改时会立即抛出 ConcurrentModificationException
。for-each
循环),也可能触发此异常。Java 提供了一些线程安全的集合类,如 ConcurrentHashMap
, CopyOnWriteArrayList
等,它们在内部处理了并发修改的问题。
import java.util.concurrent.ConcurrentHashMap;
public class Example {
public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key1", "value1");
for (String key : map.keySet()) {
map.put(key + "_new", "newValue"); // 不会抛出异常
}
}
}
remove
方法如果在迭代过程中需要删除元素,应该使用迭代器自身的 remove
方法。
import java.util.ArrayList;
import java.util.Iterator;
public class Example {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if ("A".equals(item)) {
iterator.remove(); // 正确方式
}
}
}
}
在多线程环境中,可以使用 synchronized
关键字或其他同步机制来保证集合操作的原子性。
import java.util.ArrayList;
public class Example {
private static ArrayList<String> list = new ArrayList<>();
public static synchronized void addItem(String item) {
list.add(item);
}
public static synchronized void removeItem(String item) {
list.remove(item);
}
}
java.util.ConcurrentModificationException
是一个重要的运行时异常,提示我们在并发环境下对集合的操作需要特别小心。通过使用并发集合、迭代器的正确方法或同步控制,可以有效避免这一问题。
领取专属 10元无门槛券
手把手带您无忧上云