List.iterator()线程安全吗?

ubu*_*oid 20 java collections iterator list thread-safety

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

Pet*_*rey 33

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

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

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

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


Boz*_*zho 8

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

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

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

  • "没有迭代器是线程安全的,除了一个"可以写成"除了两个或三个以外所有都是线程安全的";) (3认同)