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

多线程之ThreadLocal

最近学习多线程相关的东西,今天搞一搞ThreadLocal

简介

ThreadLocal叫做线程变量,线程对于ThreadLocal的set与get的变量,只属于当前线程,对于其他线程是隔离的

    public static void main(String[] args) {ThreadLocal<String> threadLocal = new ThreadLocal<>();for (int j = 0; j < 3; j++) {new Thread(() -> {threadLocal.set(Thread.currentThread().getName());System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get());}).start();}System.out.println("======================================");threadLocal.remove();}

当前线程设置什么,get出来就是什么,完全和其他线程无关
在这里插入图片描述

ThreadLocal的作用:

1.使每个线程都有自己独立的对象,例如当并发状态下,多个不同用户访问系统时,单个线程的用户信息对象set到ThreadLocal之后,在这个线程内,用户的信息始终一致
2.解决了参数传递的麻烦,同一个线程内, 在任何方法中都可以轻松获取到本线程对应set 的对象

ThreadLocal的实现原理:

浅看源码,ThreadLocal内部维护了一个ThreadLocalMap,而ThreadLocalMap内部则是Entry数组,当set时或者get时,使用当前线程作为key,再通过key计算出value应该在Entry数组的下标位置

以get为例,走一下代码执行过程
在这里插入图片描述
首先拿到当前线程对象,用当前线程获取ThreadLocalMap,如果map不为null,则以当前线程(this)为key获取Entry对象 key.threadLocalHashCode & (table.length - 1)则是计算key对应value在数组中的位置
在这里插入图片描述
如果在get()之前没有set,那么会走setInitialValue()方法,创建map,并且将线程作为key,null作为value返回
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这就是一次大概的过程,set和remove也差不多,都是对于Map的操作,可以拿着上面的main方法跑一下,点开ThreadLocal源码读一读马上就豁然开朗了,几个方法的开头都是先获取当前线程,因此与其他线程完全隔离

ThreadLocal数据结构示意,图片来源于网络在这里插入图片描述

ThreadLocal的一些问题:

在使用完之后万无一失的处理是对ThreadLocal进行remove处理,否则可能会出现内存泄漏问题,因为我们在开发过程中,很多时候线程池中优先使用的都是核心线程,这样的话栈中线程引用不会被回收,那么对应的entry对象的数据也会一直存在,堆栈引用关系后面专门再聊一聊


上一篇 >>>>> 记录错误Transaction was marked for rollback only; cannot commit

看千遍想万遍,还得动手练一练,量变才能产生质变

http://www.dtcms.com/a/511284.html

相关文章:

  • 如何修改root密码
  • (三)React技术核心思想——组件化编程
  • 国外唯美flash个人网站欣赏建设网银
  • 【NVIDIA-H200-3】3节点all-reduce-三节点扩展的性能边界:NVIDIA H200 24 卡集群 all-reduce 通信效率深度剖析
  • D026 vue3+django 论文知识图谱推荐可视化系统 | vue3+vite前端|neo4j 图数据库
  • 桃浦做网站常德经开区网站官网
  • ODOO数据文件(XML、CSV、SQL)是如何转换并加载到 Odoo 数据库
  • ArcGIS JSAPI 学习教程 - 要素图层(FeatureLayer)分类、分组设置可视化样式(ClassBreaksRenderer)
  • 10天!前端用coze,后端用Trae IDE+Claude Code从0开始构建到平台上线
  • [JavaEE初阶] 传输层协议---UDP 相关笔记
  • 考研408《操作系统》复习笔记,第二章《2.3 进程调度》
  • 网站开发流程有哪几个阶段网站关键词多少个合适
  • GitHub 热榜项目 - 日榜(2025-10-21)
  • 如何提高中药饮片批发业务的市场竞争力?
  • 门户网站建设关键点网站开发编程入门学习
  • 多路由隔离:构建模块化Agent工具服务器
  • [云计算] Classic Network-->VPC: 用SDN和Overlay实现隔离
  • linux shell编程实战 04 条件判断与流程控制
  • 10.21云计算作业
  • 服务器数据恢复—EqualLogic存储硬硬盘坏道,数据恢复有妙招
  • 风险识别不充分会让项目付出什么代价
  • LeetCode 46. 全排列
  • 洛谷 - P13982 数列分块入门 7(线段树解法 - 超详细版)
  • 页面PDF文件格式预览(不使用pdf.js)
  • Prompt Engineering 关键技能:精准掌控 LLM 输出的格式、内容与风格
  • 苹果(IOS)制作开发和发布证书
  • iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
  • ISO 15765系列标准在车载诊断系统中的具体应用有哪些?
  • 人体含水量测量体验系统-VR节约用水互动游戏
  • 【ArcGIS软件教程】数据导出、CAD转换、属性表导出、裁剪、空间连接、修复几何