当前位置: 首页 > 知识库问答 >
问题:

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

鱼旺
2023-03-14

我有以下情况:

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

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

我想我最感兴趣的问题是,我是否可以创建几个列表对象,通过addAll()方法将相同的product-对象添加到每个对象中,然后用它添加到每个线程中的任何东西,而不关心其他线程?!

共有1个答案

卢健
2023-03-14

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

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

Iterator<Product> iter = products.iterator();
While (iter.hasNext() {
    Product p = iter.next();
    ....
    if (some condition)
        iter.remove();
    ....
}
 类似资料:
  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 问题内容: 我有以下二维位图: 出于好奇,我想检查一下,如果它将使用整数而不是布尔值,它将占用多少空间。所以我检查了当前大小并得到 104 之后,我修改了 但仍然有 104 然后我决定看看仅用字符串我就能得到多少: ,仍然显示 104 这看起来很奇怪,因为我期望字符串列表列表浪费大量的内存,而不仅仅是布尔值。 显然我缺少有关getsizeof如何计算大小的信息。谁能解释我为什么得到这样的结果。 P

  • 问题内容: 我有一个可能具有或不具有相同属性值的对象的列表/集合。获得具有相同属性的对象的不同列表的最简单方法是什么?一种收集类型最适合此目的吗?例如,在C#中,我可以使用LINQ执行以下操作。 我最初的想法是使用lambdaj(链接文本),但似乎不支持此功能。 问题答案: 使用接口的实现(类T可能需要自定义方法,您可能必须自己实现)。通常,a 是开箱即用的:它使用和方法比较对象。对于简单的对象,

  • 我的问题是,它似乎影响和删除相同的元素从原来的列表!

  • 假设我有两个列表,现在listOld包含旧员工信息,listNew包含新员工信息 我如何比较这两个列表并返回新列表,其中包含,添加的新员工列表,包含,删除的员工列表,包含上次更新已更改的员工的新列表? 我只能想到迭代列表和比较,可能最终几乎是O(n2)时间,这可以由任何util类更有效地完成吗?

  • } 我有两个相同的对象,但是它们有不同的hashCode。为什么呢?我尝试覆盖Rational中的. equ方法r1.equals(r2)==true。但是它们仍然产生不同JavahashCode。