繁体   English   中英

失败快速迭代器

[英]fail-fast iterator

我得到了这个定义:正如名称所暗示的那样,一旦他们意识到自迭代开始以来 Collection的结构已经改变,那么失败快速迭代器就会失败。

迭代开始以来意味着什么? 这意味着Iterator it = set.iterator()这行代码?

public static void customize(BufferedReader br) throws IOException{  
    Set<String> set=new HashSet<String>(); // Actual type parameter added  
    **Iterator it=set.iterator();**

首先,它们是快速失败的,而不是故障安全的

合同是某些类型的集合的结构修改(即插入/删除)使现有的迭代器无效。 快速失败的迭代器尝试检测它们不应该是有效的并抛出ConcurrentModificationException 这是为程序员提供的一项服务,可以帮助您更快地发现此类错误。

在你的例子中:

Iterator it = set.iterator();
it.next();
set.add("unique-entry"); // invalidates the iterator
it.next();

如果你很幸运,第二个it.next()将检测无效使用并抛出异常。 请注意,这是在尽力而为的基础上完成的,并不能保证。

迭代器快速失败意味着下面的代码会失败:

Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
set.add("");
it.next();   // the set has changed now, and the iterator will throw an exception

因为发生以下一系列事件:创建迭代器,然后更改其底层集合,然后访问迭代器。

这意味着Iterator it = set.iterator()这行代码?

是。 如果你看一下HashSet.iterator()的代码,你会发现它只是这样:

return map.keySet().iterator();

...将HashMap.KeySet.iterator()委托给HashMap.KeySet.iterator() 链中还有一些链接,但最终你会到达HashMap.HashIterator ,它在构造函数中包含这个:

private abstract class HashIterator<E> implements Iterator<E> {
    int expectedModCount;   // For fast-fail

    ...

    HashIterator() {
        expectedModCount = modCount;
        ...
    }
}

...其中modCountHashMap的封闭实例中的一个字段,用于跟踪修改的数量。

是的,在使用.iterator()之后不要更改集合如果你打算迭代它,你可以使用.remove()如果你想删除最新的元素

在失败之前快速Iterator开始工作它正在计算收集,并且在任何迭代之后它检查计数是否被更改,并且在更改计数的情况下JVM将抛出ConcurrentModificationException。 Fail fast迭代器是java.util包中的任何集合迭代器(例如ArrayList,LinkedList等),Fail Safe迭代器是java.concurrent包内的迭代器(例如CopyOnWriteArrayList,CopyOnWriteSet等)。 失败快速迭代器将在并发修改的情况下抛出异常,但失败安全迭代器基本上使用集合副本,在并发修改的情况下不会抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM