有时候在操作JAVA集合类的比如ArrayList的时候,会抛出

ConcurentModificationException,下面就介绍一下什么时候会抛出ConcurentModificationException什么不会。

单线程:

ConcurentModificationException异常_Java开发

单线程:第一种遍历会出现

ConcurrentModificationException异常,第二种不会。

原因:第一种遍历的时候:当在循环中删掉一个元素的时候,modCount加1

ConcurentModificationException异常_Java开发_02

modCount初始值为0。

foreach循环,在获取下个元素的时候,调用的是Itr的next方法:

ConcurentModificationException异常_Java开发_03

在next方法中,执行checkForComodification()

ConcurentModificationException异常_Java开发_04

int expectedModCount 值在初始的时候与modCount相等,当list改变的时候modCount发生了变化,而expectedModCount没有改变,因此会抛出异常。

第二种遍历,直接读取list内部的数组,因此没有抛出异常。

ConcurentModificationException异常_Java开发_05

如果单线程采用:

ConcurentModificationException异常_Java开发_06

也不会抛出异常,因为删除是调用的:

ConcurentModificationException异常_Java开发_07

这个remove方法,在执行完成后会执行expectedModCount=modCount,这样在后面的遍历的时候,执行next方法的时候,就不会抛出异常了。

ConcurentModificationException异常_Java开发_08

多线程:如果采用

ConcurentModificationException异常_Java开发_09

也不会抛出异常。

但是如果采用下面任何一种,都会抛出异常:

ConcurentModificationException异常_Java开发_10

ConcurentModificationException异常_Java开发_11

因为next方法不是同步方法。