【发布时间】:2016-01-03 09:23:55
【问题描述】:
在迭代时向LinkedList 添加项目是否安全?
class Worker {
final LinkedList<Foo> worklist = new LinkedList<>();
public void work() {
Iterator<Foo> iterator = worklist.iterator();
while (iterator.hasNext()) {
Foo foo = iterator.next();
doSomethingWith(foo);
}
}
public void doSomethingWith(Foo foo) {
// do something with foo
// and possibly add one (or more) foo's to the worklist
if (expression) {
worklist.add(new Foo());
}
}
}
如果不是,如何以安全有效的方式实施这种行为?
请注意,这不是about a List,而是专门针对LinkedList。如果不安全,我正在询问替代方案。
【问题讨论】:
-
stackoverflow.com/questions/3362018/… 能够在迭代时更改列表中的值也是与多线程相关的属性。如果列表可以使用迭代器,则一般规则不是线程安全的
-
如果在迭代列表时更改列表,它将抛出 ConcurrentModificationException。
-
为什么不使用 ListIterator 并在迭代器的帮助下添加元素?我们可以通过 worklist.listIterator() 访问它
-
@IvanBochko 我也必须遍历添加的元素。
标签: java linked-list iterator listiterator