ConcurrentModificationException 出现在使用 ForEach遍历,迭代器遍历的同时,进行删除,增加出现的异常。平常使用的ArrayList, HashMap都有可能抛出这种异常,粗心的话,很容易犯这种错误,导致线上事故! 2. 情景列举 下面就ArrayList的一些使用场景,来讨论是否会抛出ConcurrentModificationException 2.1 For..i 遍历 这个遍历的...
java中两种基本的集合结构ArrayList和LinkedList底层有两种不同的存储方式实现,ArrayList为数组实现,属于顺序存储,LinkedList为链表实现,属于链式存储,在对ArrayList做迭代删除时,会出现ConcurrentModificationException publicstaticvoidmain(String[] args) { List<String> list =newArrayList<String>(); list.add("aa"); I...
2. 描述在什么情况下ArrayList会抛出ConcurrentModificationException ArrayList在迭代过程中,如果检测到集合的大小被改变(例如,通过add、remove等方法),就会抛出ConcurrentModificationException。这通常发生在多线程环境中,当一个线程正在迭代ArrayList,而另一个线程同时修改了这个ArrayList。
在下个元素做checkForComodification的时候异常就抛出了。 异常的解决 查看源码,modCount是在ArrayList的父类AbstractList中定义的,modCount记录list被修改的次数。在iterator和实现iterator的list中,进行next(),remove()、previous、set、add操作时,modCount的值被意外改变,将抛出异常ConcurrentModificationException。关于异常...
Exception in thread “main” java.util.ConcurrentModificationException at java.util.AbstractList… 根本原因 以上都有3种出现异常的情况有一个共同的特点,都是使用Iterator进行遍历,且都是通过ArrayList.remove(Object) 进行删除操作。 想要找出根本原因,直接查看ArrayList源码,原因是modCount不等于expectedModCount,则...
当Fail-Fast机制检测到并发修改时,会立即抛出ConcurrentModificationException异常,防止迭代继续执行。这样做的目的是为了避免在不确定的数据状态下进行迭代,保证数据的一致性和可靠性。Fail-Fast机制通过在ArrayList内部维护一个modCount变量来实现。modCount记录了对ArrayList的结构进行修改的次数。在每次迭代开始时,会将...
而后每次访问下一个元素之前,都会检查下modCount值是否变化,如果有变化,说明List的长度有变化。一旦长度有变化,就会抛出ConcurrentModificationException异常。 modCount的注释详细说明了这个字段表明List发生结构性变化(长度被修改)的次数,也就是删除插入等操作时,这个字段要加一。有兴趣的读者可以自行搜索下ArrayList代码,看...
java.util.ConcurrentModificationException 4问题原因: 1,3都是因为list的长度改变,Iterator执行next()方法时,调用checkForComodification()时出错,1,3是同一个问题,这两个方法remove操作都是执行的是ArrayList中的remove方法,根本原因在于expectedModCount与modCount他们的不相等,由于执行了ArrayList中的remove(),modCoun...
Java的ArrayList是一个广泛使用的动态数组,然而在多线程环境下,对ArrayList进行迭代时可能引发ConcurrentModificationException异常。这是由ArrayList的Fail-Fast机制所导致的。本文将深入剖析Fail-Fast机制的原理,并结合代码示例演示如何正确处理并发修改问题,确保Java应用程序的稳定性和可靠性。
分析异常位置在checkForComodification()方法 final void checkForComodification () { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } 所以我们从源码入手进一步分析其原因 Arraylist 没有iterator(),在Arraylist的父类找到查看 public Iterator<E> iterator() { return new Itr...