单线程中出现的并发修改异常
在学习Java并发编程的过程中,可以了解到,在对用迭代器对容器进行迭代时,即使是单线程代码中也可能抛出 ConcurrentModificationException
异常,即对象直接从容器中删除而不是通过 Iterator.remove
来删除时,就会抛出这个异常,如下代码:
@Test // java.util.ConcurrentModificationException
public void test1() {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
// 用迭代器访问对象的过程中
list.remove(0); // 对象直接从容器中删除
System.out.println(iterator.next());
}
}
包括我们使用 for-each
循环时,仍然会出现并发修改异常,因为 for-each
循环语法中,对容器类进行迭代的标准方式都是使用迭代器 Iterator
。
@Test // java.util.Concurrent