当前位置: 首页 > article >正文

ConcurrentModificationException:检测到并发修改完美解决方法

🚦 ConcurrentModificationException:检测到并发修改完美解决方法 💡
摘要
1. 什么是ConcurrentModificationException?🤔
2. ConcurrentModificationException的常见场景 🚦
2.1 使用for-each循环遍历集合时修改集合
2.2 在Iterator遍历中修改集合
3. 如何解决ConcurrentModificationException?🔧
3.1 使用Iterator的remove方法
3.2 使用CopyOnWriteArrayList
3.3 使用临时集合
4. 代码示例 📝
5. 小结 📚

1. 什么是ConcurrentModificationException?🤔

ConcurrentModificationException是Java中的一种运行时异常,位于java.util包中。当你在遍历集合(如List、Set、Map)时,如果在遍历的同时对集合进行修改(例如,添加或删除元素),就会抛出这个异常。

2. ConcurrentModificationException的常见场景 🚦


以下是一些可能触发ConcurrentModificationException的常见场景:2.1 使用for-each循环遍历集合时修改集合

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");

// 遍历时修改集合
for (String fruit : list) {
    if (fruit.equals("Banana")) {
        list.remove(fruit); // 将抛出ConcurrentModificationException
    }
}
2.2 在Iterator遍历中修改集合


如果在使用Iterator遍历集合时,直接调用集合的修改方法,也会抛出该异常:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String fruit = iterator.next();
    if (fruit.equals("Banana")) {
        list.remove(fruit); // 将抛出ConcurrentModificationException
    }
}


3. 如何解决ConcurrentModificationException?🔧

以下是一些常用的方法来处理和避免ConcurrentModificationException。

3.1 使用Iterator的remove方法

在遍历集合时,使用Iterator的remove()方法来安全地删除元素。

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String fruit = iterator.next();
    if (fruit.equals("Banana")) {
        iterator.remove(); // 使用Iterator的remove()方法
    }
}
3.2 使用CopyOnWriteArrayList

如果你的应用场景中需要频繁读和少量写,可以考虑使用CopyOnWriteArrayList,它是一个线程安全的列表实现,适合并发读写的场景。



List<String> list = new CopyOnWriteArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");

for (String fruit : list) {
    if (fruit.equals("Banana")) {
        list.remove(fruit); // 不会抛出异常
    }
}

3.3 使用临时集合

在遍历时,可以先将要删除的元素存储在一个临时集合中,遍历完成后再统一删除。

List<String> toRemove = new ArrayList<>();

for (String fruit : list) {
    if (fruit.equals("Banana")) {
        toRemove.add(fruit); // 将待删除的元素添加到临时集合中
    }
}

list.removeAll(toRemove); // 统一删除

4. 代码示例 📝

下面是一个完整的示例,演示如何安全地处理ConcurrentModificationException:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExceptionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 使用Iterator的remove方法
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            if (fruit.equals("Banana")) {
                iterator.remove(); // 使用Iterator的remove()方法
            }
        }

        System.out.println("更新后的列表:" + list);
    }
}
5. 小结 📚

在这篇文章中,我们深入分析了ConcurrentModificationException的成因及其解决方法。通过使用Iterator的remove()方法、使用线程安全的CopyOnWriteArrayList或临时集合,我们可以有效地避免和处理ConcurrentModificationException。


http://www.kler.cn/a/584842.html

相关文章:

  • 计算机二级web易错点(2)-选择题
  • 通过C++编程语言实现“数据结构“课程中的树
  • Pycharm(五)序列的操作
  • 基于ragflow中deepdoc对pdf文档的rag系统
  • QQuick3D-Camera的介绍
  • 【2025前端高频面试题——系列三之vue生命周期:vue3】
  • 机器学习(李宏毅)——Explainable AI
  • 【UniApp跳转外部链接】实现方案
  • (全)2024下半年真题 系统架构设计师 综合知识 答案解析01
  • Ceph(2):Ceph简介
  • OpenText ETX 助力欧洲之翼航空公司远程工作升级
  • 98. 验证二叉搜索树
  • CSS—网格布局Grid
  • 浅谈交易暨百城联动线下技术交流会-南宁站圆满举行
  • 在 CentOS 7 上安装 PHP 7.3
  • [微服务设计]2_演化式架构
  • 微信小程序:实现多功能表格效果,例如滚动效果、宽度自定义、多选、行内编辑等功能
  • 从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(五)完整源码已上传!
  • ALSA vs OSS:Linux 音频架构的演变与核心区别
  • 九点标定和十二点标定的区别