List.iterator()线程安全吗?

25
在Java中:List.iterator() 是否线程安全,即返回的迭代器是否在任何时候都反映列表的当前状态,还是只反映它创建时的状态?
3个回答

40

List.iterator()的行为在不同List实现中没有定义或一致。

对于ArrayList、LinkedList,如果在您迭代列表时修改了列表,则可能会抛出ConcurrentModificationException。(这不是有保证的)避免此问题的方法是使用synchronizedList()并在迭代期间锁定列表。

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

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


15

没有迭代器是线程安全的。如果在迭代期间底层集合被修改,将抛出 ConcurrentModificationException

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

唯一的例外是 CopyOnWriteArrayList,它在迭代期间保持快照。


3
“除了一个迭代器,其他的都不是线程安全的”可以被重新表述为“除了两三个迭代器,其他都是线程安全的” ;) - Peter Lawrey
1
如果在迭代期间另一个线程修改了底层集合,则可能会抛出CME,也可能不会抛出,因为内部修改计数器不是原子的。 - Anton

0

这取决于你使用的类,

不是因为 Collections.synchronizedList(new ArrayList<>());

而是因为 CopyOnWriteArrayList

最好的描述 在这里


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