0

0

如何解决Java中的ConcurrentModificationException_集合并发修改方案

P粉602998670

P粉602998670

发布时间:2026-03-11 02:55:09

|

875人浏览过

|

来源于php中文网

原创

遍历arraylist时调用remove()会抛concurrentmodificationexception,因其迭代器为fail-fast机制,通过modcount检测非迭代器途径的结构性修改。

如何解决java中的concurrentmodificationexception_集合并发修改方案

为什么遍历 ArrayList 时调用 remove() 会抛 ConcurrentModificationException

因为 ArrayList 的迭代器是“快速失败”(fail-fast)的:内部维护一个 modCount 计数器,每次调用 add()remove() 等结构性修改方法时自增;而迭代器在 next() 前会检查当前 modCount 是否与创建时一致。不一致就直接抛异常——它不关心你是不是单线程,只认“非迭代器途径修改”这个事实。

常见错误现象:

  • 用 for-each 循环遍历 list,循环体内写 list.remove(obj)
  • Iterator.next() 遍历,但调用的是 list.remove() 而不是 iterator.remove()
  • 多个线程共用一个 ArrayList,哪怕只读不写,只要有一个线程在修改,其他线程迭代就可能崩

单线程下安全删除元素的三种写法

核心原则:别绕过迭代器改集合本身。

  • Iterator.remove() —— 最常用也最直观:
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String s = it.next();
        if (s.startsWith("tmp")) {
            it.remove(); // ✅ 安全
        }
    }
  • 倒序 for 循环 + 索引删除 —— 适合需要索引或批量删固定位置的场景:
    for (int i = list.size() - 1; i >= 0; i--) {
        if (list.get(i).startsWith("tmp")) {
            list.remove(i); // ✅ 不影响前面元素索引
        }
    }
  • 收集待删项,遍历完再批量删 —— 适合条件复杂、要多次判断的逻辑:
    List<String> toRemove = new ArrayList<>();
    for (String s : list) {
        if (needRemove(s)) toRemove.add(s);
    }
    list.removeAll(toRemove); // ✅ removeAll 内部不走迭代器路径

多线程环境该选哪个并发集合

别给 ArrayListsynchronized 包装器——锁粒度太粗,性能差,且仍无法避免迭代时被其他线程修改。

动感购物HTML
动感购物HTML

修正了V1.10的一些BUG感购物HTML系统是集合目前网络所有购物系统为参考而开发,代码采用DIV编号,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于

下载

立即学习Java免费学习笔记(深入)”;

  • 读多写少,且允许弱一致性(比如监控列表):用 CopyOnWriteArrayList
    每次写都复制底层数组,迭代器基于快照,完全不加锁;但写操作开销大,不适合高频修改
  • 读写均衡,需强一致性:用 ConcurrentHashMap 替代“键值对集合”,或封装成线程安全的容器类
    ConcurrentLinkedQueue 适合纯队列场景,但不支持随机访问
  • 真需要线程安全的动态数组语义,又不愿妥协性能:考虑 java.util.concurrent.ForkJoinPool 配合不可变集合(如 ImmutableList),靠“替换引用”而非“原地修改”来规避问题

removeIf() 看似方便,但要注意 JDK 版本和实现细节

ArrayList.removeIf() 是 JDK 8 引入的默认方法,底层用的是 Iterator.remove(),所以单线程下是安全的;但它不是原子操作——中间如果其他线程修改了集合,仍可能触发 ConcurrentModificationException(即使你在调用 removeIf())。

  • JDK 8–10:removeIf()ArrayList 中会先遍历收集匹配索引,再倒序删除,实际是“两阶段”,比手写 Iterator 稍慢但更简洁
  • JDK 11+:优化为单次遍历 + 位图标记,性能更好,但行为一致
  • 注意:它对 LinkedList 的实现是逐个调用 Iterator.remove(),所以链表场景下不要依赖它做高频删除

真正容易被忽略的是:所有这些方案都假设你知道“什么时候要删”,而不是在监听器、回调、Stream 中隐式触发修改——那种场景下,得回溯源头,把修改动作挪到迭代生命周期之外。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

30

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 80万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号