我有一个并发的对象列表。多个线程添加到此列表中。在某些时候,我遍历此列表并对列表元素执行操作。如何确保处理循环列表时添加的元素?
主线程:
List<Object> someList = Collections.synchronizedList(new ArrayList<Object>());
for(Object o : someList){
o.toString();
}
其他一些主题:
getSomeList().add(new Object());
注意:我想在开始循环遍历列表之后(或之后)处理对象。
答案 0 :(得分:0)
当线程B循环遍历列表时,能够在线程A中添加元素的唯一方法是线程B在该确切的时间点制作列表的副本,然后获得{{1} }或Iterator
来自它。如果你在循环之前没有复制,那么如果另一个线程在另一个线程循环时添加一个元素,你将获得Enumerator
。
答案 1 :(得分:0)
使用synchronized java.util.List将无效,因为只要修改了源列表,迭代器就会变为无效。听起来你有生产者 - 消费者的问题。你应该查看一个队列。如果你想要一个无限队列,可以试试java.util.Concurrent.LinkedBlockingQueue;如果你想要一个阻塞队列,请尝试java.util.concurrent.ArrayBlockingQueue。