在java中,如何确保在循环列表之后添加的并发列表元素得到正确处理?

在java中,如何确保在循环列表之后添加的并发列表元素得到正确处理?,java,collections,java.util.concurrent,Java,Collections,Java.util.concurrent,我有一个并发的对象列表。多个线程添加到此列表中。在某个时刻,我循环遍历这个列表并对列表元素执行操作。如何确保在列表中循环时处理添加的元素 主线程: List<Object> someList = Collections.synchronizedList(new ArrayList<Object>()); for(Object o : someList){ o.toString(); } 注意:我希望在开始循环列表(或之后)后处理对象。当线程B在列表中循环时,能够

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

主线程:

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

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

当线程B在列表中循环时,能够在线程A中添加元素的唯一方法是线程B在该确切时间点复制列表,然后从中获取
迭代器或
枚举器。如果在循环之前不进行复制,那么如果另一个线程在另一个线程循环时添加元素,则会得到一个
ConcurrentModificationException

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

您有可以共享的代码吗?答案将取决于你所谈论的列表类型、循环方式、添加新元素的方式等。你的意思是如何确保在循环列表之前添加所有元素?我认为这个问题太模糊,无法给出一个好的答案。在这种情况下,我可能会定义自己的
类来表示这个列表,可能会使用自己的迭代器或方法来处理整个列表,这将在迭代开始时设置某种标志,并在迭代完成时清除它;然后,
add
方法必须检查此标志,并可能设置一个新项目的单独“待办事项”列表,迭代方法需要检查此标志以确保它处理了这些项目。这只是一种可能的方法,但我认为您需要这样做。是的,我正在考虑使用自己的类来实现这一点。我想知道是否有一些现有的解决方案(在并发库、Google guava等中)我应该使用。答案是描述Java库提供的特定列表实现的行为。可以实现自己的数据结构,以不同的方式处理场景。
getSomeList().add(new Object());