java - 为什么迭代器被称为故障安全或快速故障?

标签 java collections iterator concurrentmodification

为什么迭代器被称为“fail-safe”和“fail-fast”,即使 Iterator.remove() 在迭代 ConcurrentModificationException 时不会抛出任何 ConcurrentModificationException使用 Iterator 的 code>Collection(例如 HashMap)?

最佳答案

顾名思义,快速失败迭代器一旦意识到自迭代开始以来集合的结构已发生更改,就会失败。结构更改意味着在一个线程迭代该集合时添加、删除或更新集合中的任何元素。快速失败行为是通过保留修改计数来实现的,如果迭代线程意识到修改计数的变化,它将抛出 ConcurrentModificationException。

与快速失败迭代器相反,如果集合在结构上被修改,失败安全迭代器不会抛出任何异常 而一个线程正在迭代它,因为它们工作于集合的克隆而不是原始集合,这就是为什么它们被称为故障安全迭代器。 CopyOnWriteArrayList 的迭代器是故障安全迭代器的一个示例,ConcurrentHashMap keySet 编写的迭代器也是故障安全迭代器,并且在 Java 中永远不会抛出 ConcurrentModificationException。

关于java - 为什么迭代器被称为故障安全或快速故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351946/

相关文章:

java - Java 中指针的替代方案

java - 从 java 调用 shell,它提示 "stty: standard input: Invalid argument"

java - 具有非唯一键的排序映射

java - 从 HashMap 中获取 k 个最大值

c++ - 将 C uint8_t 指针 + 大小组合转换为 C++ 迭代器

java - 如何在 SocketChannel 关闭时收到通知?

java - 如何调试使用 dataproviders 的 testng 测试?

C# 类引用的对象集

java - 使用 arraylist 随机排列范围

c++ - unordered_map::iterator->first 的地址是否会随着后续的插入和删除而改变?