java modCount是原子变量吗?

qojgxg4l  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(108)

我读到一个线程在某个列表上执行结构修改时,另一个线程在其元素上迭代时,可能会抛出ConcurrentModificationException。为了检测这种修改,类List的示例将它们被修改的次数存储在一个名为modCount的字段中。在列表的每次迭代中都会检查其值,以检查后者是否被修改。如果我的理解正确的话,对modCount的访问需要同步,因为如果在最后一次迭代中检查modCount的值之后并且在循环结束之前要修改所讨论的列表,则迭代器将不能检测到列表在其最后一次迭代期间被修改。

aiqt4smr

aiqt4smr1#

您所说的一切都是正确的,完全正常。modCount不是原子的,迭代器 * 可能 * 无法检测到列表被修改,这没关系。
注意,迭代器的故障快速行为不能得到保证,因为一般来说,在非同步并发修改存在的情况下,不可能做出任何硬保证。**故障快速迭代器会尽最大努力抛出ConcurrentModificationException。**因此,编写一个依赖于此异常来保证正确性的程序是错误的:迭代器的故障快速行为应该仅用于检测错误。
因为ArrayList并不试图保证它总是检测并发修改,所以它可以避免在正确代码中永远不应该发生的情况下使用原子变量的开销。使用非同步modCount检测最常见的情况,有时会(取决于确切的线程排序等)检测真正并发的情况。不过,请记住,ConcurrentModificationException几乎永远不会发生,因为并发实际上正在进行,而是因为有人在迭代循环期间调用了修改方法。

相关问题