ConcurentModificationException异常

有时候在操作JAVA集合类的比如ArrayList的时候,会抛出ConcurentModificationException,下面就介绍一下什么时候会抛出ConcurentModificationException什么不会。


单线程:

ConcurentModificationException异常_第1张图片

单线程:第一种遍历会出现ConcurrentModificationException异常,第二种不会。

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

ConcurentModificationException异常_第2张图片

modCount初始值为0。

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

ConcurentModificationException异常_第3张图片

在next方法中,执行checkForComodification()

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

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

ConcurentModificationException异常_第4张图片

如果单线程采用:

ConcurentModificationException异常_第5张图片

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

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

ConcurentModificationException异常_第6张图片

多线程:如果采用

ConcurentModificationException异常_第7张图片

也不会抛出异常。

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

ConcurentModificationException异常_第8张图片


ConcurentModificationException异常_第9张图片

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

你可能感兴趣的:(ConcurentModificationException异常)