如何确保正确处理在循环列表后添加的 java 并发列表的元素



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

主线程:

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

其他一些线程:

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

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

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

当线程 B 循环访问

列表时,能够在线程 A 中添加元素的唯一方法是让线程 B 复制该确切时间点的列表,然后从中获取IteratorEnumerator。如果在循环之前没有创建副本,那么如果另一个线程在循环时添加元素,您将获得ConcurrentModificationException

最新更新