Java 当从不同线程修改集合的元素时,迭代器是否抛出ConcurrentModificationException?

Java 当从不同线程修改集合的元素时,迭代器是否抛出ConcurrentModificationException?,java,concurrency,Java,Concurrency,假设我们有一些对象的ArrayList,我们在列表中迭代以读取每个对象的特征。如果列表中的某个对象在任何时候(在迭代器到达对象之前、在对象上以及在对象迭代之后)被另一个线程修改,迭代器是否会抛出ConcurrentModificationException 在写这篇文章时,我意识到列表实际上包含对对象的引用,并且在修改对象时它们保持不变,因此迭代器不应该抛出ConcurrentModificationException,但是在迭代时读取的数据可能不一致,除非实际读取过程是同步的。有人能证实这一点

假设我们有一些对象的
ArrayList
,我们在列表中迭代以读取每个对象的特征。如果列表中的某个对象在任何时候(在迭代器到达对象之前、在对象上以及在对象迭代之后)被另一个线程修改,迭代器是否会抛出
ConcurrentModificationException

在写这篇文章时,我意识到列表实际上包含对对象的引用,并且在修改对象时它们保持不变,因此迭代器不应该抛出
ConcurrentModificationException
,但是在迭代时读取的数据可能不一致,除非实际读取过程是同步的。有人能证实这一点吗?

“有人能证实这一点吗?”是的,你是对的。Javadoc CME:“通常不允许一个线程在另一个线程迭代集合时修改集合。”(集合,而不是其元素)
ArrayList
:“如果列表在结构上被修改…,迭代器将抛出ConcurrentModificationException”(结构上被修改:添加/删除元素,thtat是更改列表的大小,但不包括正在更改的元素)