故障快速迭代器如何知道在抛出' ConcurrentModificationException'时会修改底层结构。被抛出?

时间:2014-04-19 15:36:46

标签: java iterator

失败快速迭代器一旦意识到自迭代开始以来已经改变了Collection的结构,就会失败。结构更改意味着在一个线程迭代该集合时添加,删除或更新集合中的任何元素。

但是如何知道这种变化呢?

1 个答案:

答案 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   检测错误。