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
计数器,它是用封闭的 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;
...
}
当您调用 Iterator
的方法时,例如 next()
或 remove()
,它会调用 checkForComodification()
方法:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果 ArrayList
的 modCount
自 Iterator
实例创建后递增,则会引发异常。
我知道什么是快速失败和故障安全迭代器。 如果集合发生结构性修改,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
计数器,它是用封闭的 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;
...
}
当您调用 Iterator
的方法时,例如 next()
或 remove()
,它会调用 checkForComodification()
方法:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果 ArrayList
的 modCount
自 Iterator
实例创建后递增,则会引发异常。