1、看一个示例
运行上述代码,抛出一个异常:
这是一个典型的并发修改异常,如果把上述代码中的125行注释,把126行打开,运行就能通过了;
原因:
1)因为在迭代的时候,使用的是Itr类的对象,在调用hasNext()方法的时候,只要cursor和szie不相等就返回true;
2)在Itr类中存在一个属性字段:expectedModCount,每次调用next()方法的时候都会检查expectedModCount和modCount是否相等,
如果不相等,就会抛出异常;
3)调用Itr类的remove()方法,运行能通过,因为在这个方法中,对expectedModCount字段做了重新赋值的操作;
2、再看一个示例
上述示例使用的是concurrent包中的CopyOnWriteArrayList类,运行情况跟(1)示例正好相反;
打开145行,运行正常;如果注释145行,打开146行,则运行报错;分析一下原因:
1)CopyOnWriteArrayList类中定义了一个重入锁,在调用remove()方法的时候加锁了,而且执行删除的逻辑与ArrayList逻辑不一样;
创建一个新的数组,把数据赋值到新的数组中,然后重新设置数组;
2)CopyOnWriteArrayList类也定义了一个内部类COWIterator,remove()方法内直接抛了一个异常