在Java中:
List.iterator()
是否线程安全,即返回的迭代器是否在任何时候都反映列表的当前状态,还是只反映它创建时的状态?List.iterator()
是否线程安全,即返回的迭代器是否在任何时候都反映列表的当前状态,还是只反映它创建时的状态?List.iterator()的行为在不同List实现中没有定义或一致。
对于ArrayList、LinkedList,如果在您迭代列表时修改了列表,则可能会抛出ConcurrentModificationException。(这不是有保证的)避免此问题的方法是使用synchronizedList()并在迭代期间锁定列表。
对于Vector,集合已经同步,但是迭代器不是线程安全的。
对于CopyOnWriteArrayList,在调用iterator()时获取列表中元素的快照。该迭代器是线程安全的,并且不需要使用任何锁定。注意: 元素的内容可以更改。
没有迭代器是线程安全的。如果在迭代期间底层集合被修改,将抛出 ConcurrentModificationException
。
即使是同步集合的迭代器也不是线程安全的 - 您必须手动进行同步。
唯一的例外是 CopyOnWriteArrayList
,它在迭代期间保持快照。
这取决于你使用的类,
不是因为 Collections.synchronizedList(new ArrayList<>());
,
而是因为 CopyOnWriteArrayList
。
最好的描述 在这里