并发修改异常

个人理解:

  ArrayList 集合继承自:AbstractList

  在AbstractList中定义了一个 modCount 变量,用于记录在集合使用过程中对集合增删操作的次数(修改了集合长度的操作的次数)

  ArrayList作为实现类自然也就继承了这个变量,并初始化为0

  当ArrayList创建了Iterator对象时,会生成两个变量:cursor、expectedModCount

  expectedModCount变量在创建时就被赋值为了modCount,当对集合做了修改后,迭代元素的过程中会继续检查两个变量的值是否相同,如果不同就会抛出并发修改异常。

public E next() {
    checkForComodification();       //next()第一行就会调用方法,如果不相等就会抛出  并发修改异常
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

Java并发修改异常的源码解析

posted @ 2020-07-18 15:58  德华。  阅读(298)  评论(0编辑  收藏  举报