为什么迭代器被称为“fail-safe”和“fail-fast”,即使 Iterator.remove()
在迭代
(例如 ConcurrentModificationException
时不会抛出任何 ConcurrentModificationException
使用 Iterator
的 code>CollectionHashMap
)?
最佳答案
顾名思义,快速失败迭代器一旦意识到自迭代开始以来集合的结构已发生更改,就会失败。结构更改意味着在一个线程迭代该集合时添加、删除或更新集合中的任何元素。快速失败行为是通过保留修改计数来实现的,如果迭代线程意识到修改计数的变化,它将抛出 ConcurrentModificationException。
与快速失败迭代器相反,如果集合在结构上被修改,失败安全迭代器不会抛出任何异常 而一个线程正在迭代它,因为它们工作于集合的克隆而不是原始集合,这就是为什么它们被称为故障安全迭代器。 CopyOnWriteArrayList 的迭代器是故障安全迭代器的一个示例,ConcurrentHashMap keySet 编写的迭代器也是故障安全迭代器,并且在 Java 中永远不会抛出 ConcurrentModificationException。
关于java - 为什么迭代器被称为故障安全或快速故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351946/