gpt4 book ai didi

Java:ConcurrentModificationException,3 个线程,不同的列表,相同的对象

转载 作者:行者123 更新时间:2023-11-30 08:20:16 24 4
gpt4 key购买 nike

我有以下情况:

在某个 Controller 类的主函数中,我从我的数据库中检索了 10 个产品对象。这些保存在 ArrayList 对象中。

然后,我创建了三个扩展 Runnable 的类,并为每个类提供了构造函数中的 product-ArrayList。

在每个构造函数中都创建了一个新的本地 ArrayList 并添加了 product-ArrayList 中的对象:

this.products = new ArrayList();
products.addAll(productListParam);

然后我启动了三个线程中的每一个,它们遍历了它们的本地产品列表并对其进行了修改。

我在遍历本地产品 ArrayList 时收到 ConcurrentModificationException..

为什么会这样?我假设如果我在每个线程中创建一个完整的新列表,我可以在本地尽可能多地修改它而不关心其他线程 - 我是对的吗?或者从本地列表中删除某些对象是否会以某种方式影响 pbjects,以便其他线程抛出并发修改异常?

实际上堆栈跟踪看起来像:

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at com.x.y.class.method(Classname.java:326)

326 处的 Classname.java 看起来像:

325:List<Product> productsToDelete = new ArrayList();
326:for(Product p: products){
...
if(xy){
productsToDelete.add(p);
}
}
products.removeAll(productsToRemove);

也许有人提示我做错了什么?

编辑:在循环内部,产品对象 p 仅用于读取。此外,没有对 products-ArrayList 进行任何修改。它们只被添加到第二个“toBeRemoved”列表中,以便在 for 循环完成后删除它们。我编辑了上面的代码。

我想我最感兴趣的问题是我是否可以创建多个列表对象,通过 addAll() 方法向每个列表对象添加相同的产品对象,然后可以在每个线程中使用它进行任何操作,而无需关心其他线程?!

最佳答案

您不能在迭代其元素的增强 for 循环中修改 Collection。即使您只有一个线程也不行。

您没有在增强的 for 循环中包含代码,但如果您需要在其中执行的操作是从列表中删除元素,则可以使用显式迭代器。

Iterator<Product> iter = products.iterator();
While (iter.hasNext() {
Product p = iter.next();
....
if (some condition)
iter.remove();
....
}

关于Java:ConcurrentModificationException,3 个线程,不同的列表,相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com