modCount 是原子变量吗?

Meh*_*ife -1 java concurrency list concurrentmodification

我读到,ConcurrentModificationException只要一个线程对某个列表执行结构修改,而另一个线程正在迭代其元素,则可以抛出 a 。为了检测此类修改,类的实例将List它们被修改的次数存储在名为 的字段中modCount,在列表的每次迭代时检查该字段的值以检查后者是否被修改。如果我的理解是正确的,则需要同步访问,因为如果在检查最后一次迭代中的值之后和循环结束之前modCount要修改所涉及的列表,则迭代器将无法检测到该列表是modCount在最后一次迭代期间进行了修改。

Lou*_*man 5

你说的一切都是正确的,而且完全正常。 modCount不是原子的,迭代器可能无法检测到列表已被修改,但这没关系。重新访问 ArrayList 文档:

请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步并发修改的情况下不可能做出任何硬保证。快速失败迭代器会尽力抛出 ConcurrentModificationException。因此,编写依赖于此异常来确保其正确性的程序是错误的:迭代器的快速失败行为应该仅用于检测错误。

因为ArrayList不尝试保证它总是检测到并发修改,所以它可以避免原子变量对于正确代码中不应该发生的情况的开销。使用非同步modCount检测最常见的情况,有时(取决于确切的线程顺序等)检测真正并发的情况。但请记住,这种情况ConcurrentModificationException几乎永远不会发生,因为并发实际上正在发生,而是因为有人在迭代循环期间调用了修改方法。