在Java中:List.iterator()
是否是线程安全的,即返回的迭代器是在任何时候反映列表的当前状态还是在创建列表时反映列表的状态?
答案 0 :(得分:32)
List.iterator()的行为未定义或与不同的List实现一致。
对于ArrayList,LinkedList,如果在迭代时修改了列表,则可以获得ConcurrentModificationException。 (这不能保证)避免此问题的方法是使用synchronizedList()并在迭代时锁定列表。
对于Vector,集合是同步的,但迭代器不是线程安全的。
对于CopyOnWriteArrayList,您在调用iterator()时获得列表中元素的快照,此迭代器是线程安全的,您不需要使用任何锁定。注意:元素的内容可以改变。
答案 1 :(得分:8)
没有迭代器是线程安全的。如果在迭代中更改了基础集合,则抛出ConcurrentModificationException
。
即使是同步集合的迭代器也不是线程安全的 - 您必须手动同步。
一个例外是CopyOnWriteArrayList
,它在迭代期间保存一个快照。
答案 2 :(得分:0)
这取决于您使用的课程,
不是出于Collections.synchronizedList(new ArrayList<>());
的原因,而是
出于CopyOnWriteArrayList
的原因。
最佳描述here