Java Fail fast迭代器如何在内部工作?

Java Fail fast迭代器如何在内部工作?,java,collections,fail-fast,Java,Collections,Fail Fast,我知道什么是故障快速和故障安全迭代器。 如果对集合进行了结构修改,快速失败迭代器将立即抛出ConcurrentModificationException Fail-Safe在处理集合的克隆时不会引发任何异常 我的问题是,快速失效迭代器如何知道对我的集合进行了修改?实现这一点没有单一的方法 在ArrayList(以及java.util中的其他类)的情况下,迭代器保留一个(“预期修改计数”),它将其与AbstractList的(“修改计数”)进行比较,每当对列表进行结构修改时,该计数就会更新;如果两

我知道什么是故障快速和故障安全迭代器。 如果对集合进行了结构修改,快速失败迭代器将立即抛出ConcurrentModificationException

Fail-Safe在处理集合的克隆时不会引发任何异常


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

实现这一点没有单一的方法


ArrayList
(以及
java.util
中的其他类)的情况下,迭代器保留一个(“预期修改计数”),它将其与
AbstractList
的(“修改计数”)进行比较,每当对列表进行结构修改时,该计数就会更新;如果两个值不同,迭代器将抛出异常。

您可以自己检查实现

让我们考虑<代码> ARAYLIST/<代码>。p> 它有一个内部的

Itr
类,
iterator()
方法返回它的一个实例

Itr
类有一个
expectedModCount
计数器,该计数器由封装的
ArrayList
modCount
初始化:

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;
    ...
}

如果
迭代器
实例创建后,
数组列表
modCount
增加,则会引发异常。

我鼓励您编写一个小方法,并尝试实现一个行为,以便它在某些预定义条件下引发异常。或者只要条件满足,方法就应该停止执行并抛出异常。@madhepurian感谢您的想法,肯定会尝试它:)“如何?”有一个
int
计数器,它由每个进行结构修改的方法递增。每个相关迭代器操作都会将该值与创建迭代器时存储的计数器值进行检查。参见
AbstractList
字段(或其源代码)的文档
    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }