在 JDK 1.6 的 HashSet.java 中,有一些关于 HashSet 迭代器的 fail-fast 属性的注释。
此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改集合,除了通过迭代器自己的 remove 方法之外,迭代器会抛出 ConcurrentModificationException。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。
我可以理解上面的段落,因为它非常简单明了,但我无法理解下面的段落。如果我有一些简单的例子表明快速失败的迭代器甚至会失败,我可能会理解它。
请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。