SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案
问题描述
在Spring Boot 3项目中,使用CompletableFuture进行异步编程时,偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常,但代码中并未直接操作List或CopyOnWriteArrayList等集合类。

异常原因分析
-
默认线程池问题
CompletableFuture.supplyAsync()或runAsync()默认使用ForkJoinPool.commonPool(),该池为全局共享线程池。当多个异步任务竞争共享资源(如Spring容器管理的非线程安全Bean)时,可能引发并发冲突。 -
隐式共享状态修改
即使未显式操作集合,若异步任务中调用的方法间接修改了某个共享状态(如缓存、静态变量、非线程安全的第三方组件),也会触发此异常。
解决方案及代码实现
通过显式指定线程池+结合@Async注解的双重防护策略,可有效解决因线程竞争导致的ConcurrentModificationException。核心思路是通过资源隔离切断并发冲突路径,同时提高系统异步调用的可控性。
结合@Async注解强化异步隔离
配置@Async专用线程池ThreadPoolTaskExecutor
ThreadPoolTaskExecutor 是 Spring 框架中的一个工具类,用于管理线程池。它是 org.springframework.scheduling.concurrent 包的一部分,提供了一种方便的方式来处理并发任务,特别是在需要执行大量短期任务的情况下。
它的核心功能是基于 Java 的 java.util.concurrent.ThreadPoolExecutor,但通过 Spring 进行了进一步的封装和简化,以便于在 Spring 应用程序中更轻松地配置和使用。ThreadPoolTaskExecutor 提供以下功能:
-
线程池管理:可以通过配置核心线程数、最大线程数、队列容量等来优化资源使用。
-
任务调度:在多线程环境中按需分配和执行任务。
-
支持动态调整:可以根据实际需求动态调整线程池的属性,比如增减线程数量。
-
与 Spring 的集成:与 Spring 的上下文很好地结合,可以轻松注入到其他组件中。
它常用于需要高效地处理并发任务的场景,如异步任务执行、事件处理、任务调度等。

@Configuration
@EnableAsync // 启用异步支持
public class AsyncConfig {@Bean("asyncTaskExecutor")public Executor asyncTaskExecutor() {//Powered by Moshow@https://zhengkai.blog.csdn.net/ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5); // 核心线程数executor.setMaxPoolSize(10); // 最大线程数executor.setQueueCapacity(25); // 队列容量executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}
}
在Service层使用@Async注解并使用CompletableFuture<T>包装返回
当需要执行任务时,可以通过注入 ThreadPoolTaskExecutor 来提交任务,线程池会根据配置进行调度和处理。
在 Spring 中使用 @Async 注解时,可以通过指定一个自定义的 ThreadPoolTaskExecutor 来管理异步方法的执行线程池。
@Service
public class BusinessService {@Async("asyncTaskExecutor") // 指定线程池public CompletableFuture<String> doInternalOperation() {//Powered by Moshow@https://zhengkai.blog.csdn.net/// 方法内部可能存在隐式共享状态操作return CompletableFuture.completedFuture("Result");}
}
关键原理说明
-
线程池隔离
通过自定义线程池避免全局池竞争,确保异步任务资源独立,降低并发冲突概率。 -
双层级异步控制
-
外层
CompletableFuture控制任务提交流程 -
内层
@Async方法实现业务逻辑与线程池的深度绑定
双重隔离机制彻底切断共享状态污染路径。
-
-
Spring上下文传播
使用@Async+线程池时,Spring会自动传递上下文(如事务、SecurityContext),而直接使用CompletableFuture需手动处理。
注意事项
-
避免混合使用不同线程池
确保CompletableFuture和@Async使用相同或逻辑隔离的线程池配置。 -
监控线程池状态
建议通过Micrometer等工具监控线程池队列堆积、拒绝次数等指标。 -
异常处理
CompletableFuture需链式调用.exceptionally()处理异常,@Async方法可定义AsyncUncaughtExceptionHandler。
示例代码已通过Spring Boot 3.2.x验证,强烈建议根据infrastructure情况和实际业务需要调整线程池参数。
Powered by Moshow@https://zhengkai.blog.csdn.net/
相关文章:
SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案
问题描述 在Spring Boot 3项目中,使用CompletableFuture进行异步编程时,偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常,但代码中并未直接操作List或CopyOnWriteArrayList等集合类…...
【Nodejs】2024 汇总现状
之前已经调研了容器、nexus-public,实现了本地构建应用镜像和基础设施的镜像。为实现分布式一体化协作开发的目标,还需要配套的线上协作开发环境。故而重回前端调研现状,比较 5 年前的 nodejs 快好的啊。 以下是针对 Node.js 工具链的深度解析…...
LeetCode 每日一题 2025/3/17-2025/3/23
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/17 1963. 使字符串平衡的最小交换次数3/18 2614. 对角线上的质数3/19 2610. 转换二维数组3/20 2612. 最少翻转操作数3/21 2680. 最大或值3/22 2643. 一最多的行3/23 2116…...
STM32__红外避障模块的使用
目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释: VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点: …...
android 音量调节
安卓音频数据的最终音量由三部分组成,分别是master volume(全局音量,对整个系统所有的音频数据生效),stream volume(流音量,只针对特定类型的音频数据生效)和track volume(track音量,只针对某个audiotrack的…...
Redis JSON 用id读取content总结(sendCommand())
Redis JSON 读取总结(方法 2 - sendCommand()) 💡 背景 在 Redis 中,我们存储了 JSON 数据,并希望通过 Jedis sendCommand() 方式读取 JSON 里的 "content" 字段。由于 jedis.jsonGet() 可能在旧版本不支持…...
使用Qdrant等其他向量数据库时需要将将numpy 数组转换为列表 确保数据能被正确处理和序列化,避免类型不兼容的问题。
在使用Qdrant等其他向量数据库时需要 转换 numpy 数组为列表主要是为了确保数据能被正确处理和序列化,避免类型不兼容的问题。具体原因如下: 序列化兼容性: 很多数据库接口、API 或者 JSON 序列化工具只能处理 Python 的内置类型(…...
[AI速读]如何构建高效的AMBA协议检查器(Checker IP)
在芯片验证过程中,检查器(Checker)是确保设计符合协议规范的关键工具。本文基于一篇技术论文,分享如何为AMBA协议(如AXI、AHB)构建可重用的检查器IP(Checker IP,简称CIP),并简化其核心思路,帮助工程师快速上手。 一、什么是Checker IP? Checker IP是一组用SystemVe…...
基于3DMax与Vray引擎的轻量级室内场景渲染实践
欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…...
浅谈Qt事件子系统——以可拖动的通用Widget为例子
浅谈Qt事件子系统——以可拖动的通用Widget为例子 这一篇文章是一个通过实现可拖动的通用Widget为引子简单介绍一下我们的事件对象子系统的事情 代码和所有的文档 1:Qt侧的API介绍和说明 这个是每一个小项目的惯例,我会介绍大部分Qt程序中使用到的…...
QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建
目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装MSVC编译器 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中,我们介绍了本教程的目标和结…...
登山第二十梯:无人机实时自主探索——我是一只小小小鸟
文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 (UAV) 各种应用的基本问题。最近,基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息,但许多现有的勘探方…...
Pytorch使用手册—扩展 TorchScript 使用自定义 C++ 操作符(专题五十三)
提示 本教程自 PyTorch 2.4 起已弃用。有关 PyTorch 自定义操作符的最新指南,请参阅 PyTorch 自定义操作符。 PyTorch 1.0 版本引入了一种名为 TorchScript 的新编程模型。TorchScript 是 Python 编程语言的一个子集,可以被 TorchScript 编译器解析、编译和优化。此外,编译后…...
word插入Mathtype公式居中和自动更新
word插入公式自动更新 前提:安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…...
网络层之IP协议
在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…...
基于springboot的旅游网站(013)
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理…...
人工智能 - 在 Spring Boot 中调用 AnythingLLM+DeepSeek 的知识库获取消息接口
整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口:/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . 部署 AnythingLLM DeepSeek 本地知识库 的环境要求如下: 一、硬件要求 CPU 最低:4核&#x…...
体育直播模板nba英超直播欧洲杯直播模板手机自适应
源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…...
STM32-ARM
一、体系架构 ARM里有37个寄存器ALU算数逻辑单元PC程序计数器:指向哪里执行哪里SP栈指针寄存器LR链接寄存器:保存函数入口地址CPSR(current program status register)当前程序状态寄存器:SOSR(CPSR的备份)MMU(内存管理单元)Cache高速缓冲(iCa…...
ripro 主题激活 问题写入授权Token失败,可能无文件写入权限
ripro 主题激活 问题 写入授权Token失败,可能无文件写入权限 找到主题下面的functions.php文件,给其他写入权限。就好了。...
Lustre 语言的 Rust 生成相关的工作
目前 Lustre V6 编译器支持编译生成的语言为C语言。但也注意到,以 Rust 语言为生成目标语言,也存在若干相关工作。 rustre(elegaanz) 该项工作为 Lustre v6 语言的解析器,使用 Rust 语言实现。生成 Lustre AST。 项…...
计算机网络——通信基础和传输介质
物理层任务:实现相邻节点之间比特(0或1)的传输 到了数据链路层之后,它会以帧为单位,把若干个比特交给物理层,物理层需要把这些比特信息转化成信号,在物理传输媒体上进行传输 通信基础基本概念 信…...
python-selenium 爬虫 由易到难
本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题) 驱动下载网址:链接: link 1、实战1 (1)安装 selenium 库 pip install selenium&#…...
Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.
What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…...
【Linux 维测专栏 2 -- Deadlock detection介绍】
文章目录 kernel 编译选项配置deadlock 测试代码deadlock 测试 logkernel 编译选项配置 通过 menuconfig 配置下面编译选项 # lockdep CONFIG_LOCK_STAT=y CONFIG_PROVE_LOCKING=y CONFIG_DEBUG_LOCKDEP=y上面配置完成后会定义下面宏: CONFIG_LOCK_DEBUGGING_SUPPORT=y CONF…...
T113-i开发板的休眠与RTC定时唤醒指南
在嵌入式系统设计中,休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式:freeze和mem,以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…...
Node.js系列(4)--微服务架构实践
Node.js微服务架构实践 🔄 引言 微服务架构已成为构建大规模Node.js应用的主流选择。本文将深入探讨Node.js微服务架构的设计与实现,包括服务拆分、服务治理、通信机制等方面,帮助开发者构建可扩展的微服务系统。 微服务架构概述 Node.js…...
基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。
大白话CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。 在 CSS 的弹性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 这三个属性对弹性元素的尺寸和伸缩性起着关键作用。下面为你详细…...
基于CVX优化器的储能电池调峰调频算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质,能…...
