java.util.ConcurrentModificationException
是 Java 集合框架中的一个常见异常,它通常发生在使用迭代器遍历集合时,如果集合在遍历过程中被修改(如添加、删除元素),就会抛出这个异常。这个异常的目的是为了防止不可预知的行为,因为并发修改可能导致迭代器的状态与集合的实际状态不一致。
null
。ConcurrentModificationException
提供了一种快速失败(fail-fast)的机制,它可以在并发修改发生时立即通知开发者,而不是在未来的某个不确定时间点导致更严重的错误。ArrayList
的 add
或 remove
方法,就会触发 ConcurrentModificationException
。ArrayList
,而另一个线程同时修改了它,也会抛出此异常。remove
方法如果你需要在迭代过程中删除元素,应该使用迭代器自身的 remove
方法,而不是集合的 remove
方法。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
iterator.remove(); // 正确的方式
}
}
在多线程环境中,应该使用 java.util.concurrent
包下的并发集合,如 CopyOnWriteArrayList
,它允许在迭代时进行修改而不会抛出 ConcurrentModificationException
。
List<String> concurrentList = new CopyOnWriteArrayList<>();
concurrentList.add("A");
concurrentList.add("B");
concurrentList.add("C");
for (String element : concurrentList) {
if ("B".equals(element)) {
concurrentList.remove(element); // 不会抛出异常
}
}
如果你需要手动控制同步,可以使用 synchronized
关键字或者 ReentrantLock
来确保在迭代过程中集合不会被修改。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
synchronized(list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
// 在同步块中进行操作
}
}
ConcurrentModificationException
是一个保护机制,用于防止在迭代过程中对集合进行非法修改。解决这个问题通常涉及到使用迭代器的 remove
方法、使用并发集合或者通过同步机制来控制对集合的访问。选择哪种方法取决于具体的应用场景和需求。
领取专属 10元无门槛券
手把手带您无忧上云