他们之间有什么区别…
“故障安全”(在工程中)表示某些故障不会造成或只造成最小的损坏。严格地说,有 没有这样的事情
在Java中的故障安全迭代器。如果迭代器失败(通常为“失败”),则可能会发生损坏。
我怀疑您实际上是在说“弱一致性”迭代器。Javadoc说:
“大多数并发Collection实现(包括大多数Queue)也与通常的java.util约定不同,因为它们的Iterators和Spliterators提供了弱一致性而不是快速失败遍历。”
通常,弱一致性意味着如果在迭代过程中同时修改集合,则对迭代结果的保证就较弱。(详细信息将在每个并发集合类javadocs中指定。)
“快速失败”(在系统设计中)是指积极检查故障状况,以便在可能造成太多损坏之前(可能为1)检测到故障状况。在Java中,快速失败的迭代器会因抛出失败
ConcurrentModificationException。
“快速失败”和“弱一致性”的替代是语义,其中迭代无法预测地失败。例如,有时会给出错误的答案或引发意外的异常。(这是
Enumeration早期Java版本中API
的一些标准实现的行为。)
…并且它们不同于我们用于收集的迭代器。
否。这些是由标准Collection类型实现的迭代器的 属性
。也就是说,当针对同步和Java内存模型1正确使用它们时,它们要么是“快速失败”,要么是“弱一致性” 。
快速失败迭代器 通常 使用
volatile收集对象上的计数器 来 实现。
- 更新集合时,计数器会增加。
Iterator
创建an时,计数器的当前值将嵌入到Iterator
对象中。- 当
Iterator
执行操作,该方法比较两个计数器值和抛出一个CME如果它们是不同的。
相反,弱一致性迭代器通常是轻量级的,并利用每个并发集合的内部数据结构的属性。没有一般模式。如果您有兴趣,请阅读不同集合类的源代码。
1-失败的原因是,快速失败行为假设应用程序ID关于同步和内存模型正确无误。这意味着(例如)如果您在
ArrayList没有正确同步的情况下进行迭代,则结果可能是损坏的列表结果。“快速失败”机制可能会检测到并发修改(尽管不能保证),但不会检测到潜在的损坏。例如,javadoc for这样
Vector.iterator()说:
“不能保证迭代器的快速失败行为,因为通常来说,在存在不同步的并发修改的情况下,不可能做出任何严格的保证。快速失败迭代器会
ConcurrentModificationException尽最大努力。因此,编写依赖于此异常的程序的正确性是错误的:迭代器的快速失败行为仅应用于检测错误。”



