快速失败迭代器是如何知道底层结构被修改时抛出“ConcurrentModificationException”异常的?

3

快速失败迭代器会在意识到集合的结构在迭代开始后发生变化时立即失败。结构性变化指的是在一个线程正在迭代该集合时,添加、删除或更新集合中的任何元素。

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


源代码是免费提供的,你可以查看它。另外,标志! - Sotirios Delimanolis
1个回答

6
我刚刚查看了HashMap类的源代码。特别是搜索'modCount'。例如,私有的HashIterator类会记录自创建实例以来已修改实例次数的计数(除使用'remove'方法外)。
对于'nextEntry'方法,检查计数是否已更改,可能会抛出该异常。'remove'方法也会检查计数,但如果成功,则将计数重置为新值。它这样做是为了使您可以使用'remove'方法删除条目而不会得到异常。
其他方法(例如'clear')将增加'modCount'。如上述代码摘录所示,这将导致在下一次调用'nextEntry'时引发异常。
没有任何保证该异常会被抛出。
API:

http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

请注意,故障快速行为无法保证,因为通常情况下,在存在未同步的并发修改时无法做出任何硬性保证。故障快速操作尽最大努力抛出ConcurrentModificationException异常。因此,编写依赖于此异常正确性的程序是错误的:应仅使用ConcurrentModificationException检测错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接