ConcurentModificationException异常

2018-06-25  本文已影响0人  alexwu59

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


单线程:

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

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

modCount初始值为0。

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

在next方法中,执行checkForComodification()

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

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

如果单线程采用:

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

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

多线程:如果采用

也不会抛出异常。

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

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

上一篇下一篇

猜你喜欢

热点阅读