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

多线程问题,子线程同时操作全局变量,使用后需要清空吗 ?

在这里插入图片描述

背景:目前有一个全局变量
,某个方法中通过多线程,都操作这个变量,向这个全局变量中去添加元素,然后等所有子线程执行完了之后,对这个全局变量进行批量保存,然后这个全局变量还需要手动去清空吗?
?好像目前出现的情况,批量保存之后没有手动清空,导致下次再去使用这个List的时候,会在原来的基础上,叠加新元素!

现象确实是这样的;原因分析:

在多线程环境下操作全局的 List(如 finEodBalancePOS ),若批量保存后不手动清空,确实会导致后续使用时数据叠加,出现重复数据问题。以下从 问题本质是否需要清空正确清空方式 三个维度详细分析:

一、问题本质:全局变量的“状态残留”

// 全局/成员变量
List<FinCiticFlowPO> finEodBalancePOS = new CopyOnWriteArrayList<>();// 多线程添加元素
executor.submit(() -> {finEodBalancePOS.add(new FinCiticFlowPO(...));
});// 批量保存
finCiticFlowService.saveBatch(finEodBalancePOS);// 若不手动清空,下次使用时,List 仍保留之前的元素
  • 原因finEodBalancePOS 是全局/成员变量,其生命周期与类或应用一致。保存后数据不会自动消失,下次添加元素时会在原有数据基础上继续追加,导致重复数据。

二、是否需要手动清空?

必须手动清空,但要注意清空的时机

  • 错误时机:在多线程添加元素的过程中清空 → 会导致线程安全问题(如刚添加的数据被清空)。
  • 正确时机:批量保存成功后,确保数据已持久化到数据库,再清空 List

三、正确的清空方式(3种方案)

方案1:保存后直接清空(最简单)
// 批量保存
finCiticFlowService.saveBatch(finEodBalancePOS);// 保存成功后,清空 List
finEodBalancePOS.clear();
  • 优点:简单直接,适合“保存后立即复用 List”的场景。
  • 注意:需确保 saveBatch 方法执行成功(如无异常抛出),否则数据未保存就清空会丢失数据。
方案2:保存后创建新 List(避免多线程并发清空问题)
// 批量保存
finCiticFlowService.saveBatch(finEodBalancePOS);// 新建一个空 List 替换原变量(适合多线程可能同时操作的场景)
finEodBalancePOS = new CopyOnWriteArrayList<>();
  • 优点:通过“替换引用”的方式清空,避免多线程下 clear() 可能引发的并发修改问题(如其他线程还在添加元素时,clear() 会导致数据丢失 )。
  • 适用场景finEodBalancePOS 是全局变量,且可能被多个线程同时访问时。
方案3:结合 try-finally 确保清空(防止异常导致未清空)
try {// 批量保存finCiticFlowService.saveBatch(finEodBalancePOS);
} finally {// 无论保存是否成功,都尝试清空(需根据业务决定是否“失败也清空”)finEodBalancePOS.clear();// 或替换引用:finEodBalancePOS = new CopyOnWriteArrayList<>();
}
  • 优点:即使 saveBatch 抛出异常,也能执行清空操作,避免 List 因异常残留数据。
  • 注意:若业务要求“保存失败时保留数据以便重试”,则不能在 finally 中清空,需调整逻辑。

四、多线程场景下的安全清空

finEodBalancePOSCopyOnWriteArrayList(线程安全的 List 实现 ),clear() 本身是线程安全的,但仍需注意:

  • 清空时机:必须在所有子线程添加元素完成后清空,否则可能清空未处理完的数据。
  • 验证所有线程完成:可通过 CountDownLatchFuture 确保所有子线程执行完毕后,再执行保存和清空逻辑(参考之前的多线程异常处理方案 )。

五、总结

  • 必须手动清空:全局 List 不会自动清空,若不处理会导致数据叠加。
  • 清空时机:在批量保存成功后清空,确保数据已持久化。
  • 线程安全:若多线程同时操作 List,推荐用 CopyOnWriteArrayList 并在保存后替换引用(方案2),或严格保证清空时无线程写入。

按此逻辑调整后,就能避免下次使用 List 时数据重复叠加的问题。

http://www.lryc.cn/news/613331.html

相关文章:

  • 容器之王--部署Docker私有仓库harbor母盘步骤演练
  • 小米前端笔试和面试
  • AI日报0807 | GPT-5或今晚1点来袭:四大版本全曝光
  • 使用Ollama本地部署DeepSeek、GPT等大模型
  • 13-netty基础-手写rpc-消费方生成代理-05
  • 车辆特征与车牌识别准确率↑29%:陌讯多模态融合算法实战解析
  • [spring-cloud: 动态刷新]-源码分析
  • 基于MATLAB实现支持向量机(SVM)分类
  • android 之 Kotlin中Handler的使用
  • 栅栏密码的加密解密原理
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 使用 decimal 包解决 go float 浮点数运算失真
  • 可执行文件的生成与加载执行
  • Linux的进程间通信
  • 嵌入式学习硬件(一)ARM体系架构
  • 简单手写Transformer:原理与代码详解
  • Java中的反射机制
  • 土壤盐分传感器与土壤电导率传感器直接的关系
  • 深入理解String类:揭秘Java字符串常量池的优化机制
  • 【2025最新版】火狐浏览器(官方版)安装-附教程
  • 飞算JavaAI深度解析:Java开发者的智能革命
  • AUTOSAR进阶图解==>AUTOSAR_EXP_BSWDistributionGuide
  • 损耗对信号质量的影响
  • Java 八大经典排序算法全解析
  • 数组指针-函数指针-回调函数
  • 人工智能——自动微分
  • Docker容器部署harbor-小白级教学
  • Dlib库是什么?白话,详细介绍版
  • python中用xlrd、xlwt读取和写入Excel中的日期值
  • GIT操作卡顿