ConcurentModificationException异常

有时候在操作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方法不是同步方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容