Fail-fast Iterator 在内部是如何工作的?

How Fail-fast Iterator works internally?

我知道什么是快速失败和故障安全迭代器。 如果集合发生结构性修改,Fail-Fast 迭代器会立即抛出 ConcurrentModificationException。

Fail-Safe 在处理集合的克隆时不会抛出任何异常。

我的问题是快速失败迭代器如何知道对我的集合进行了修改?

没有单一的方法可以实现这一点。

ArrayList(以及 java.util 中的其他 类)的情况下,迭代器保留一个 int expectedModCount ("expected modification count"), which it compares to the AbstractList's int modCount("modification count"),它会被更新每当对列表进行结构修改时;如果两个值不同,迭代器将抛出异常。

你可以自己检查实现。

让我们以ArrayList为例。

它有一个内部 Itr class,它是 iterator() 方法 returns 的一个实例。

Itr class 有一个 expectedModCount 计数器,它是用封闭的 ArrayListmodCount:

初始化的
private class Itr implements Iterator<E> {
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;
    ...
}

当您调用 Iterator 的方法时,例如 next()remove(),它会调用 checkForComodification() 方法:

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

如果 ArrayListmodCountIterator 实例创建后递增,则会引发异常。