本帖最后由 小蜀哥哥 于 2018-3-28 16:36 编辑
Java并发修改异常的源码解析
1. 什么时候会产生并发修改异常[Java] 纯文本查看 复制代码 final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
} 由此方法可知,当一个名为modCount的变量值不等于expectedModCount的变量值时,异常对象被抛出。
2.2 继续探究这两个变量分别是代表什么 原因解释:
- 集合中倒数第二个元素的索引为size - 2,当迭代器取出集合倒数第二个元素的时候,cursor指向的位置会向右移动一位,值会变为size - 1;
- 如果此时通过集合去删除一个元素,集合中元素个数会减一,所以size值会变为size - 1;
- 当迭代器试图去获取最后一个元素的时候,会先判断是否还有元素,调用hasNext()方法,上文中已经分析过,hasNext()方法会返回cursor!=size,但是此时的cursor和此时的size值都等于删除之前的size - 1,两者相等,那么hasNext()方法就会返回false,迭代器就不会再调用next方法获取元素了。
|