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

普拉泰克

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

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

斯蒂芬·C

他们之间有什么区别...

“故障安全”(在工程中)表示某些故障不会造成或只造成最小的损坏。严格地说,有没有这样的事情在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

pyautogui故障安全的目的是什么?

来自分类Dev

故障安全移动命令

来自分类Dev

如何启动故障安全图形会话?(使用鼠标和网络浏览器)

来自分类Dev

为什么故障安全插件需要集成测试和验证目标?

来自分类Dev

用于spary-json解析的故障安全包装器

来自分类Dev

子模块的故障安全注射器。Google Guice中的可选绑定

来自分类Dev

MaybeT / Maybe和IO:故障安全读取信息

来自分类Dev

在Java / Ajax中而不是PHP中验证表单的故障安全方法?

来自分类Dev

访问被拒绝后,c ++中的故障安全代码

来自分类Dev

Maven故障安全未运行测试

来自分类Dev

故障安全序列化

来自分类Dev

Maven故障安全未运行测试

来自分类Dev

用于集成测试的故障安全插件

来自分类Dev

故障安全 RetryPolicy - 从 supplyAsync 抛出异常

来自分类Dev

为什么不能以故障安全方式将csv文档插入SOLR

来自分类Dev

Memtest86 +“故障安全”模式有什么用?

来自分类Dev

Maven故障安全插件:如何使用集成前和集成后测试阶段

来自分类Dev

Maven:如何使用故障安全插件在jar中运行/包含类?

来自分类Dev

Maven故障安全:在其他目录中启动码头

来自分类Dev

Maven故障安全插件总是跳过集成测试

来自分类Dev

Maven故障安全插件意外挂起

来自分类Dev

并发Hashmap-故障安全问题

来自分类Dev

Maven 集成测试阶段未绑定到故障安全

来自分类Dev

Maven 故障安全系统属性变量

来自分类Dev

Maven不会使用故障安全插件运行集成测试

来自分类Dev

超过删除故障安全点后,Snowflake数据将如何处理?

来自分类Dev

迁移到Spring Boot 2.4.0后,不再使用故障安全插件执行IT

来自分类Dev

是否没有用于GPU的故障安全驱动程序?

来自分类Dev

Maven故障安全-Dtest报告已写入surefire = reports文件夹

Related 相关文章

  1. 1

    pyautogui故障安全的目的是什么?

  2. 2

    故障安全移动命令

  3. 3

    如何启动故障安全图形会话?(使用鼠标和网络浏览器)

  4. 4

    为什么故障安全插件需要集成测试和验证目标?

  5. 5

    用于spary-json解析的故障安全包装器

  6. 6

    子模块的故障安全注射器。Google Guice中的可选绑定

  7. 7

    MaybeT / Maybe和IO:故障安全读取信息

  8. 8

    在Java / Ajax中而不是PHP中验证表单的故障安全方法?

  9. 9

    访问被拒绝后,c ++中的故障安全代码

  10. 10

    Maven故障安全未运行测试

  11. 11

    故障安全序列化

  12. 12

    Maven故障安全未运行测试

  13. 13

    用于集成测试的故障安全插件

  14. 14

    故障安全 RetryPolicy - 从 supplyAsync 抛出异常

  15. 15

    为什么不能以故障安全方式将csv文档插入SOLR

  16. 16

    Memtest86 +“故障安全”模式有什么用?

  17. 17

    Maven故障安全插件:如何使用集成前和集成后测试阶段

  18. 18

    Maven:如何使用故障安全插件在jar中运行/包含类?

  19. 19

    Maven故障安全:在其他目录中启动码头

  20. 20

    Maven故障安全插件总是跳过集成测试

  21. 21

    Maven故障安全插件意外挂起

  22. 22

    并发Hashmap-故障安全问题

  23. 23

    Maven 集成测试阶段未绑定到故障安全

  24. 24

    Maven 故障安全系统属性变量

  25. 25

    Maven不会使用故障安全插件运行集成测试

  26. 26

    超过删除故障安全点后,Snowflake数据将如何处理?

  27. 27

    迁移到Spring Boot 2.4.0后,不再使用故障安全插件执行IT

  28. 28

    是否没有用于GPU的故障安全驱动程序?

  29. 29

    Maven故障安全-Dtest报告已写入surefire = reports文件夹

热门标签

归档