1

我有一个并发的对象列表。多个线程添加到此列表。在某些时候,我会遍历这个列表并对列表元素执行操作。如何确保在循环列表时处理添加的元素?

主线:

List<Object> someList = Collections.synchronizedList(new ArrayList<Object>());
for(Object o : someList){
    o.toString();
}

其他一些线程:

getSomeList().add(new Object());

注意:我想在开始循环列表后(或之后)处理对象。

4

2 回答 2

0

在线程 B 循环遍历列表时,能够在线程 A 中添加元素的唯一方法是,线程 B 在该确切时间点复制列表,然后从中获取Iterator或。Enumerator如果您在循环之前不进行复制,那么您将得到一个ConcurrentModificationExceptionif 另一个线程在另一个线程循环时添加了一个元素。

于 2013-09-19T20:27:23.883 回答
0

使用同步的 java.util.List 将不起作用,因为一旦源列表被修改,迭代器就会变得无效。听起来你有一个生产者 - 消费者问题。您应该查看队列。如果您想要一个无界队列,请尝试 java.util.Concurrent.LinkedBlockingQueue,如果您想要一个阻塞队列,请尝试 java.util.concurrent.ArrayBlockingQueue。

于 2013-09-19T20:50:37.453 回答