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