失败快速迭代器一旦意识到自迭代开始以来已经改变了Collection的结构,就会失败。结构更改意味着在一个线程迭代该集合时添加,删除或更新集合中的任何元素。
但是如何知道这种变化呢?
答案 0 :(得分:4)
刚检查了HashMap类的源代码。特别是搜索' modCount'。例如,私有HashIterator类保留实例被修改的次数(除了使用' remove'方法),因为实例已创建。
对于' nextEntry'方法检查计数是否已更改并可能抛出该异常。 '删除'方法还会检查计数,但如果成功,则将计数重置为新值。它这样做是为了你可以使用'删除'删除条目而不获取异常的方法。
其他方法(例如' clear')会增加' modCount'。正如上面的代码摘录所示,这将导致异常被提出下一次调用' nextEntry'。
无法保证会抛出异常。
API:
http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
请注意,通常情况下无法保证快速失败的行为 说话,在场的情况下不可能做出任何硬性保证 不同步的并发修改。失败快速操作投掷 ConcurrentModificationException是尽力而为的。因此,它 编写一个依赖于此异常的程序是错误的 它的正确性:应该只使用ConcurrentModificationException 检测错误。