List.iterator() 是线程安全的吗?

在Java中:线程安全吗,即返回的迭代器是随时反映列表的当前状态,还是仅反映列表创建时的状态?List.iterator()


答案 1

List.iterator() 的行为未定义或与不同的 List 实现一致。

对于 ArrayList,LinkedList,如果列表在迭代时被修改,则可以获得 ConcurrentModificationException。(这不能保证)避免此问题的方法是使用 synchronizedList() 并在迭代列表时锁定该列表。

对于 Vector,集合是同步的,但迭代器不是线程安全的。

对于 CopyOnWriteArrayList,您可以在调用 iterator() 时获得列表中元素的快照,此迭代器是线程安全的,并且您不需要使用任何锁定。注意:元素的内容可以更改。


答案 2

没有一个迭代器是线程安全的。如果在迭代过程中更改了基础集合,则会抛出 a。ConcurrentModificationException

即使是同步集合的迭代器也不是线程安全的 - 您必须手动同步。

一个例外是 ,它在迭代期间保存快照。CopyOnWriteArrayList