【发布时间】:2014-11-29 09:22:16
【问题描述】:
我有以下情况:
在一个主函数中,如果某个控制器类我从我的数据库中检索 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() 方法将相同的产品对象添加到每个对象,然后可以在每个线程中使用它添加任何内容,而无需关心其他线程?!
【问题讨论】:
标签: java multithreading arraylist concurrentmodification