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

ThreadLocal 的工作原理

ThreadLocal 是一个 静态工具类,全局只有一个定义。
但它存放的数据并不是存在 ThreadLocal 对象里,而是存在 线程对象内部的 threadLocals 中。

1️⃣ ThreadLocal 的核心代码

public class ThreadLocal<T> {public void set(T value) {Thread t = Thread.currentThread();   // 获取当前线程ThreadLocalMap map = getMap(t);      // 每个线程有一个 mapif (map != null) {map.set(this, value);            // this 就是 ThreadLocal 实例(key)} else {createMap(t, value);             // 如果 map 为空则新建}}public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {return (T) map.get(this);        // 根据 this 取值}return null;}
}

2️⃣ Thread 类里的成员

class Thread {ThreadLocal.ThreadLocalMap threadLocals = null; // 每个线程自己维护一份
}

也就是说,值是存在 线程对象的 threadLocals 里,而不是在 ThreadLocal 对象本身。

3️⃣ ThreadLocalMap 的结构

每个线程的 ThreadLocalMap 内部维护:

Entry[] table; // Entry 是 ThreadLocal -> value 的映射static class Entry extends WeakReference<ThreadLocal<?>> {Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}
}

也就是说:

  • key = ThreadLocal 实例
  • value = 存进去的对象

4️⃣ 示例结构图

Thread (线程)└── ThreadLocalMap (存放数据的容器)├── Entry(ThreadLocalA -> "userId=1001")├── Entry(ThreadLocalB -> "traceId=abc123")└── Entry(ThreadLocalC -> "dateFormat=yyyy-MM-dd")

这里的 ThreadLocalA/B/C 就是不同的 ThreadLocal 对象,它们是 key。
这样,每个 ThreadLocal 就能“命中”自己那份数据,互不干扰。

5️⃣ 弱引用的作用

ThreadLocalMap.Entry 继承了 WeakReference<ThreadLocal<?>>

  • key(ThreadLocal 对象)是 弱引用,当 ThreadLocal 没有被外部引用时,GC 会自动回收 key
  • 对应的 value 是强引用,不会被自动回收。
  • 这就是所谓的 ThreadLocal 内存泄漏 问题。

文章转载自:

http://9Iq92g7X.bxnrx.cn
http://WEWGGbNg.bxnrx.cn
http://7DrqyLhN.bxnrx.cn
http://9weVGLJh.bxnrx.cn
http://UMpMUi1L.bxnrx.cn
http://LgkSNj6v.bxnrx.cn
http://VZmF3Ata.bxnrx.cn
http://5OSawAUv.bxnrx.cn
http://3xGEnJMK.bxnrx.cn
http://GGtmvzpV.bxnrx.cn
http://8VEHj9Cv.bxnrx.cn
http://DEDrdsrE.bxnrx.cn
http://gp5Z4tnH.bxnrx.cn
http://1h5nf6OP.bxnrx.cn
http://oYG7ekWU.bxnrx.cn
http://CU4wQztj.bxnrx.cn
http://ftAw5vKQ.bxnrx.cn
http://H3vpWpiy.bxnrx.cn
http://y1BZCGJR.bxnrx.cn
http://jJx0DbZz.bxnrx.cn
http://AlubrrjB.bxnrx.cn
http://QwOqouhX.bxnrx.cn
http://L2oCayC2.bxnrx.cn
http://9lHdHvEQ.bxnrx.cn
http://dsiMOJFc.bxnrx.cn
http://a60Xoipa.bxnrx.cn
http://uIGMHiD0.bxnrx.cn
http://3OFg1oU4.bxnrx.cn
http://7PHf1Qo1.bxnrx.cn
http://u3Kjb29G.bxnrx.cn
http://www.dtcms.com/a/388454.html

相关文章:

  • Windows 11 下载安装 CosyVoice2,一键启动
  • 《Vuejs设计与实现》第 16 章(解析器) 下
  • JavaSE——图书系统项目
  • PHP 中 Class 的使用说明
  • Android入门到实战(九):实现书架页——RecyclerView + GridLayoutManager + 本地数据库
  • 日常开发-20250917
  • 基于SpringBoot+Vue的近郊农场共享管理系统(Echarts图形化分析)
  • AI开发实战:从数据准备到模型部署的完整经验分享
  • 【漏洞预警】大华DSS数字监控系统 user_edit.action 接口敏感信息泄露漏洞分析
  • RFID赋能光伏电池片制造智能化跃迁
  • 大数据 + 分布式架构下 SQL 查询优化:从核心技术到调优体系
  • FPGA硬件设计-DDR
  • 卫星通信天线的跟踪精度,含义、测量和计算
  • 忘记MySQL root密码,如何急救并保障备份?
  • Java 异步编程实战:Thread、线程池、CompletableFuture、@Async 用法与场景
  • 贪心算法应用:硬币找零问题详解
  • while语句中的break和continue
  • 10cm钢板矫平机:一场“掰直”钢铁的微观战争
  • Python实现计算点云投影面积
  • C++底层刨析章节二:迭代器原理与实现:STL的万能胶水
  • 学习Python中Selenium模块的基本用法(14:页面打印)
  • 便携式管道推杆器:通信与电力基础设施升级中的“隐形推手”
  • leetcode 349 两个数组的交集
  • UV映射!加入纹理!
  • 车辆DoIP声明报文/识别响应报文的UDP端口规范
  • Elasticsearch 2.x版本升级指南
  • OpenCV 人脸检测、微笑检测 原理及案例解析
  • [Python编程] Python3 集合
  • [性能分析与优化]伪共享问题(perf + cpp)
  • OC-动画实现折叠cell