当前位置: 首页 > 面试题库 >

什么是Java中的故障安全和故障快速迭代器

司徒寒
2023-03-14
问题内容

Java中有两种迭代器:故障安全和故障快速。

这是什么意思,它们之间的区别是什么?


问题答案:

他们之间有什么区别…

“故障安全”(在工程中)表示某些故障不会造成或只造成最小的损坏。严格地说,有 没有这样的事情
在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尽最大努力。因此,编写依赖于此异常的程序的正确性是错误的:迭代器的快速失败行为仅应用于检测错误。”



 类似资料:
  • 问题内容: 我得到这样的定义:顾名思义,快速失败的迭代器一旦意识到 自迭代开始以来 就已经改变了Collection的结构,它就会失败。 自迭代开始以来 是什么意思?是在 Iterator it = set.iterator()之后的 这行代码的意思吗? 问题答案: 首先,它们是 快速 故障的,而不是故障 安全的 。 合同规定,对某些类型的集合进行结构修改(即插入/删除)会使集合中的现有迭代器无效

  • 本文向大家介绍Java中故障快速和故障安全之间的区别,包括了Java中故障快速和故障安全之间的区别的使用技巧和注意事项,需要的朋友参考一下 序号 键 不及格 故障安全 1 例外 集合中的任何更改(例如在线程期间添加,删除和更新集合)都是迭代集合,然后使快速抛出并发修改异常失败。  故障安全集合不会引发异常。  2。 集合类型 ArrayList和hashmap集合是快速失败迭代器的示例  Copy

  • YAML模式被定义为一组标签的组合,并包括用于解析非特定标签的机制。 YAML中的故障安全模式以这样的方式创建,即它可以与任何YAML文档一起使用。 它也被视为通用YAML文档的推荐架构。 类型 故障安全模式有两种类型:通用映射和通用序列。 通用映射 它代表一个关联容器。 这里,每个键在关联中是唯一的,并且映射到恰好一个值。 YAML对键定义没有任何限制。 下面给出了表示通用映射的示例 - JSO

  • Fuel 支援各式各样的配置,有时为了正常工作需要一些配置。以下列出了几个当你在你的机器上设置 Fuel 时可能跳出的情况。 当你的问题没有列在下面,或已列出但没有提供适当的解决方案时,请在议题追蹤(http://dev.fuelphp.com)回报此问题。 纯净安装下 500 错误 纯净安装下语法错误 能运作,但首页是 404。 Oil 无法连到 DB 但应用程序可以 ORM/DB 回传我的资料

  • Webpack 的配置比较复杂,很容出现错误,下面是一些通常的故障处理手段。 一般情况下,webpack 如果出问题,会打印一些简单的错误信息,比如模块没有找到。我们还可以通过参数 --display-error-details 来打印错误详情。 $ webpack --display-error-details Hash: a40fbc6d852c51fceadb Version: webpa

  • 初始设置 在创建并启动新的 Serene 应用程序之后,不能显示登录页,而当你打开浏览器控制台,却得到一条错误消息:找不到 Template.LoginPanel: 你可能使用了无效的解决方案名称,如 MyProject.Something (包含点’.’)。 当项目以这种方式命名时,模板系统将不能定位模板。 请不要在解决方案名称中使用点符号(’.’),如果必须使用点符号,可在创建解决方案之后再重