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

多线程间共享变量线程安全问题——ThreadLocal

Java并发编程中很重要的类:ThreadLocal 在多线程应用程序中,对共享变量进行读写的场景是很常见的。如果不使用一定的技术或方案,会引发各种线程安全的问题。常见解决线程安全的方式有synchronized、volatile等方式,但synchronized对性能的开销大,volatile不能保证原子性,所以这里介绍一个 解决多线程间共享变量的线程安全问题 的方法——ThreadLocal

1.什么是 ThreadLocal


ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
ThreadLocal 可以给当前线程关联一个数据(普通变量、 对象、 数组)set 方法 [源码!]
ThreadLocal 可以像 Map 一样存取数据, key 为当前线程, get 方法
每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数 据, 就需要使用多个 ThreadLocal对象实例
每个 ThreadLocal 对象实例定义的时候, 一般为 static 类型
ThreadLocal 中保存数据, 在线程销毁后, 会自动释放

threadlocal时序图:

2、ThreadLocal的作用

多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步,如图 1-3 所示

同步的措施一般是加锁,但加锁会在一定程度上增加系统的复杂度以及影响系统的性能。

为了解决多线程间共享变量的线程安全,ThreadLocal应运而生。

当创建一个ThreadLocal变量时,访问这个变量的每个线程都有这个变量的一个本地副本,当多个线程操作这个变量时,实际上就是操作自己本地内存里面的变量,从而避免了线程安全问题。图 1-3 就变成了 图1-4 如图:

3,、Threadlocal的使用示例 

public class ThreadLocalTest { private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { threadLocal.set("threadLocal变量1"); print("thread1"); System.out.println("线程1的threadLocal变量的值为:"+threadLocal.get()); }); Thread thread2 = new Thread(() -> { threadLocal.set("threadLocal变量2"); print("thread2"); System.out.println("线程2的threadLocal变量的值为:"+threadLocal.get()); }); thread1.start(); thread2.start(); } public static void print(String s){ System.out.println(s+":"+threadLocal.get()); } }

上述代码中,有一个 threadLocal 变量,

http://www.jsqmd.com/news/1161029/

相关文章:

  • API接口安全测试实战:3类接口(WSDL/Swagger/Webpack)自动化扫描与5大漏洞验证
  • 抖音无水印下载终极指南:3步快速保存高清视频的免费工具
  • 2026年7月宏碁售后全国维修网点速查手册|39城地址电话一键收藏 - 品牌售后
  • 为什么工业工程师都在用QModMaster?免费ModBus调试工具终极指南
  • 2026企业级龙虾安全管理平台横评:龙虾智能体统一管理平台选型指南 - 品牌深度评测
  • 2026年7月合肥惠普售后维修权益与质保政策解读|在保过保全知道 - 大品牌推荐
  • 综合评价后障碍因子诊断:3步解读障碍度模型O值与U值结果
  • 可出具正规收录回执广告平台推荐,朝闻通合规投放满足企业审计需求
  • 回溯题目:字母组合迭代器
  • 澳大利亚IT留学生回国求职机构:严谨综述盘点保存 - 虚拟星辰
  • 对于戴尔AWCC占用WMI Provider Host过多资源造成的随机性卡顿解决方法
  • Transformer Engine安装避坑指南:CUDA/PyTorch版本锁链与四步验证法
  • UVa 645 File Mapping
  • 抖音批量下载终极指南:3步搞定无水印视频素材库
  • Eigen 稀疏矩阵操作
  • LeetCode Hot100刷题日志D8
  • eBPF 与 OpenTelemetry 融合:构建分布式追踪的 eBPF 探针
  • Spatial-Agent:大模型驱动的地理分析工作流引擎
  • 如何快速掌握Photon-GAMS光影包:面向Minecraft玩家的完整实战指南
  • QModMaster:免费开源ModBus调试工具终极指南,5分钟快速上手工业通信
  • 167、动态分配策略中 Anchor Ratio 的重新聚类:用 K-Means 调整 YOLOv11 默认 Anchor
  • Douyin-Downloader:抖音内容自动化采集的完整技术解决方案
  • 江诗丹顿中国区官方售后服务网点|官方服务电话及地址权威公示(2026年7月最新) - 江诗丹顿中国服务中心
  • 亨得利官方名表服务中心|热线电话及门店地址权威信息公告(2026年7月更新) - 亨得利官方博客
  • 探索华为eulerfs:新一代NVDIMM文件系统的终极指南
  • Claude Fable 5 扩展:免费访问扩展
  • 积家中国官方售后服务网络全指南|官网认证地址及电话全新启用(2026年7月最新) - 积家中国服务中心
  • LangChain4J:Java原生LLM应用开发核心框架解析
  • myql innodb 锁机制
  • 3步解锁:让Direct3D 8经典游戏在现代系统重获新生的智能方案