删除 ArrayList 时出现 Java ConcurrentModificationException

标签 java concurrency

当ArrayList的Size为2时,我们使用foreach循环执行删除操作,它会打印最后一个元素,不会抛出异常,

例如:

ArrayList<String> a= new ArrayList<String>(Arrays.asList("abc","xyz"));
    for(String i : a){
        a.remove(i);
    }
// a contains "xyz"

但是当我们将 arrayList 的大小增加到超过 2 并执行该操作时,它会显示并发修改异常。 为什么它会表现出这样的行为(它适用于 2 个元素,但不适用于超过 2 个元素)?

最佳答案

ArrayList 不是线程安全的,当你改变它的结构和迭代时,你可能会遇到这种类型的麻烦。

您需要使用迭代器在迭代集合时安全地从集合中删除。

ArrayList<String> a= new ArrayList<String>(Arrays.asList("abc","xyz"));
for (Iterator<String> iterator = a.iterator(); iterator.hasNext();) {
    String string = iterator.next(); // pick one element

    // do some stuffs with the content

    iterator.remove(); // remove element
}

关于删除 ArrayList 时出现 Java ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028381/

相关文章:

java - 使用 Elasticsearch 搜索后应用过滤器

c# - 如何从 ConcurrentBag 中删除所有项目?

c++ - 与调度相关的死锁

java - 布赖恩·戈茨 : SafePoint example - is it really thread-safe?

java - 如何使用java从PDF中提取数据并分成特定的类别

java - Maven 在命令提示符下工作,但在 Powershell 下不工作

c# - 我应该如何 "Cancel"ConcurrentDictionary 中的 AddOrUpdate?

concurrency - Clojure 中的 commute 和 alter 有什么区别?

java - 如何确定多部分POST请求Java的文件大小?

java - 如何在运行微服务时禁用/启用 Micrometer 指标