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