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