news 2026/2/23 16:22:36

// 每个 Thread 对象内部都有一个 ThreadLocalMap

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
// 每个 Thread 对象内部都有一个 ThreadLocalMap

一、核心原理
1. 数据存储结构
// 每个 Thread 对象内部都有一个 ThreadLocalMap
ThreadLocal.ThreadLocalMap threadLocals = null;

// ThreadLocalMap 内部使用 Entry 数组,Entry 继承自 WeakReference<ThreadLocal<?>>
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k); // 弱引用指向 ThreadLocal 实例
value = v; // 强引用指向实际存储的值
}
}
AI写代码

2. 关键设计
线程隔离:每个线程有自己的 ThreadLocalMap 副本
哈希表结构:使用开放地址法解决哈希冲突
弱引用键:Entry 的 key(ThreadLocal 实例)是弱引用
延迟清理:set / get 时自动清理过期条目
二、源码分析
1. set() 方法流程
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value); // this指当前ThreadLocal实例
} else {
createMap(t, value);
}
}

ThreadLocal 是强大的线程隔离工具,但需要谨慎使用。在 Web 应用和线程池场景中,必须在 finally 块中调用 remove(),这是避免内存泄漏的关键。

面试回答
关于 ThreadLocal,我从原理、场景和内存泄漏三个方面来说一下我的理解。

1. 首先,它的核心原理是什么?
简单来说,ThreadLocal 是一个线程级别的变量隔离工具。它的设计目标就是让同一个变量,在不同的线程里有自己独立的副本,互不干扰。

底层结构:每个线程(Thread对象)内部都有一个自己的 ThreadLocalMap(你可以把它想象成一个线程私有的、简易版的HashMap)。
怎么存:当我们调用 ThreadLocal.set(value) 时,实际上是以当前的 ThreadLocal 实例自身作为 Key,要保存的值作为 Value,存入当前线程的那个 ThreadLocalMap 里。
怎么取:调用 ThreadLocal.get() 时,也是用自己作为 Key,去当前线程的 Map 里查找对应的 Value。
打个比方:就像去银行租保险箱。Thread 是银行,ThreadLocalMap 是银行里的一排保险箱,ThreadLocal 实例就是你手里那把特定的钥匙。你用这把钥匙(ThreadLocal实例)只能打开属于你的那个格子(当前线程的Map),存取自己的东西(Value),完全看不到别人格子的东西。不同的人(线程)即使用同一款钥匙(同一个ThreadLocal实例),打开的也是不同银行的格子,东西自然隔离了。
2. 其次,它的典型使用场景有哪些?
正是因为这种线程隔离的特性,它特别适合用来传递一些需要在线程整个生命周期内、多个方法间共享,但又不能(或不想)通过方法参数显式传递的数据。最常见的有两个场景:

场景一:保存上下文信息(最经典)
比如在 Web 应用 或 RPC 框架 中处理一个用户请求时,这个请求从进入系统到返回响应,全程可能由同一个线程处理。我们会把一些信息(比如用户ID、交易ID、语言环境)存到一个 ThreadLocal 里。这样,后续的任何业务方法、工具类,只要在同一个线程里,就能直接 get() 到这些信息,避免了在每一个方法签名上都加上这些参数,代码会简洁很多。
场景二:管理线程安全的独享资源
典型例子是 数据库连接 和 SimpleDateFormat。
像 SimpleDateFormat 这个类,它不是线程安全的。如果做成全局共享,就要加锁,性能差。用 ThreadLocal 的话,每个线程都拥有自己的一个 SimpleDateFormat 实例,既避免了线程安全问题,又因为线程复用了这个实例,减少了创建对象的开销。
类似的,在一些需要保证数据库连接线程隔离(比如事务管理)的场景,也会用到 ThreadLocal 来存放当前线程的连接。
3. 最后,关于它的内存泄漏问题
ThreadLocal 如果使用不当,确实可能导致内存泄漏。它的根源在于 ThreadLocalMap 中 Entry 的设计。

问题根源:
ThreadLocalMap 的 Key(也就是 ThreadLocal 实例)是一个 弱引用。这意味着,如果外界没有强引用指向这个 ThreadLocal 对象(比如我们把 ThreadLocal 变量设为了 null),下次垃圾回收时,这个 Key 就会被回收掉,于是 Map 里就出现了一个 Key 为 null,但 Value 依然存在的 Entry。
这个 Value 是一个强引用,只要线程还活着(比如用的是线程池,线程会复用,一直不结束),这个 Value 对象就永远无法被回收,造成了内存泄漏。
如何避免:
良好习惯:每次使用完 ThreadLocal 后,一定要手动调用 remove() 方法。这不仅是清理当前值,更重要的是它会清理掉整个 Entry,这是最有效、最安全的做法。

https://www.zhihu.com/zvideo/1993467718666589306
https://www.zhihu.com/zvideo/1993467718666589306/
https://www.zhihu.com/zvideo/1993467730964288236
https://www.zhihu.com/zvideo/1993467730964288236/
https://www.zhihu.com/zvideo/1993467726635738374
https://www.zhihu.com/zvideo/1993467726635738374/
https://www.zhihu.com/zvideo/1993467722512742213
https://www.zhihu.com/zvideo/1993467722512742213/
https://www.zhihu.com/zvideo/1993467739432587518
https://www.zhihu.com/zvideo/1993467739432587518/
https://www.zhihu.com/zvideo/1993467734965650395
https://www.zhihu.com/zvideo/1993467734965650395/
https://www.zhihu.com/zvideo/1993467743555563878
https://www.zhihu.com/zvideo/1993467743555563878/
https://www.zhihu.com/zvideo/1993467747821168219
https://www.zhihu.com/zvideo/1993467747821168219/
https://www.zhihu.com/zvideo/1993467751948375568
https://www.zhihu.com/zvideo/1993467751948375568/
https://www.zhihu.com/zvideo/1993467756918641956
https://www.zhihu.com/zvideo/1993467756918641956/
https://www.zhihu.com/zvideo/1993467760936771837
https://www.zhihu.com/zvideo/1993467760936771837/
https://www.zhihu.com/zvideo/1993467765185610461
https://www.zhihu.com/zvideo/1993467765185610461/
https://www.zhihu.com/zvideo/1993467769191159171
https://www.zhihu.com/zvideo/1993467769191159171/
https://www.zhihu.com/zvideo/1993467773309969997
https://www.zhihu.com/zvideo/1993467773309969997/
https://www.zhihu.com/zvideo/1993467777323923041
https://www.zhihu.com/zvideo/1993467777323923041/
https://www.zhihu.com/zvideo/1993467781119774756
https://www.zhihu.com/zvideo/1993467781119774756/
https://www.zhihu.com/zvideo/1993467785490228568
https://www.zhihu.com/zvideo/1993467785490228568/
https://www.zhihu.com/zvideo/1993467789810344573
https://www.zhihu.com/zvideo/1993467789810344573/
https://www.zhihu.com/zvideo/1993467793761400353
https://www.zhihu.com/zvideo/1993467793761400353/
https://www.zhihu.com/zvideo/1993467800698778114
https://www.zhihu.com/zvideo/1993467800698778114/
https://www.zhihu.com/zvideo/1993467803060179720
https://www.zhihu.com/zvideo/1993467803060179720/
https://www.zhihu.com/zvideo/1993467805400576077
https://www.zhihu.com/zvideo/1993467805400576077/
https://www.zhihu.com/zvideo/1993467807627760797
https://www.zhihu.com/zvideo/1993467807627760797/
https://www.zhihu.com/zvideo/1993467798366744682
https://www.zhihu.com/zvideo/1993467798366744682/
https://www.zhihu.com/zvideo/1993467821204727420
https://www.zhihu.com/zvideo/1993467821204727420/
https://www.zhihu.com/zvideo/1993467816242864648
https://www.zhihu.com/zvideo/1993467816242864648/
https://www.zhihu.com/zvideo/1993467826284011631
https://www.zhihu.com/zvideo/1993467826284011631/
https://www.zhihu.com/zvideo/1993467823641613628
https://www.zhihu.com/zvideo/1993467823641613628/
https://www.zhihu.com/zvideo/1993467810123371550
https://www.zhihu.com/zvideo/1993467810123371550/
https://www.zhihu.com/zvideo/1993467812614800602
https://www.zhihu.com/zvideo/1993467812614800602/
https://www.zhihu.com/zvideo/1993467836027400995
https://www.zhihu.com/zvideo/1993467836027400995/
https://www.zhihu.com/zvideo/1993467818843345853
https://www.zhihu.com/zvideo/1993467818843345853/
https://www.zhihu.com/zvideo/1993467833334637553
https://www.zhihu.com/zvideo/1993467833334637553/
https://www.zhihu.com/zvideo/1993467828720911089
https://www.zhihu.com/zvideo/1993467828720911089/
https://www.zhihu.com/zvideo/1993467838665617819
https://www.zhihu.com/zvideo/1993467838665617819/
https://www.zhihu.com/zvideo/1993467831057129673
https://www.zhihu.com/zvideo/1993467831057129673/
https://www.zhihu.com/zvideo/1993467841542910539
https://www.zhihu.com/zvideo/1993467841542910539/
https://www.zhihu.com/zvideo/1993467843900118639
https://www.zhihu.com/zvideo/1993467843900118639/
https://www.zhihu.com/zvideo/1993467846244725605
https://www.zhihu.com/zvideo/1993467846244725605/
https://www.zhihu.com/zvideo/1993467851248517359
https://www.zhihu.com/zvideo/1993467851248517359/
https://www.zhihu.com/zvideo/1993467848652236412
https://www.zhihu.com/zvideo/1993467848652236412/
https://www.zhihu.com/zvideo/1993467863403632067
https://www.zhihu.com/zvideo/1993467863403632067/
https://www.zhihu.com/zvideo/1993467865953763887
https://www.zhihu.com/zvideo/1993467865953763887/
https://www.zhihu.com/zvideo/1993467855971312079
https://www.zhihu.com/zvideo/1993467855971312079/
https://www.zhihu.com/zvideo/1993467853639275668
https://www.zhihu.com/zvideo/1993467853639275668/
https://www.zhihu.com/zvideo/1993467887244046814
https://www.zhihu.com/zvideo/1993467887244046814/
https://www.zhihu.com/zvideo/1993467858471129743
https://www.zhihu.com/zvideo/1993467858471129743/
https://www.zhihu.com/zvideo/1993467870773019324
https://www.zhihu.com/zvideo/1993467870773019324/
https://www.zhihu.com/zvideo/1993467868289996770
https://www.zhihu.com/zvideo/1993467868289996770/
https://www.zhihu.com/zvideo/1993467873197306827
https://www.zhihu.com/zvideo/1993467873197306827/
https://www.zhihu.com/zvideo/1993467883230081848
https://www.zhihu.com/zvideo/1993467883230081848/
https://www.zhihu.com/zvideo/1993467878733812503
https://www.zhihu.com/zvideo/1993467878733812503/
https://www.zhihu.com/zvideo/1993467861147076419
https://www.zhihu.com/zvideo/1993467861147076419/
https://www.zhihu.com/zvideo/1993467891425765188
https://www.zhihu.com/zvideo/1993467891425765188/
https://www.zhihu.com/zvideo/1993467897599792987
https://www.zhihu.com/zvideo/1993467897599792987/
https://www.zhihu.com/zvideo/1993467906403632655
https://www.zhihu.com/zvideo/1993467906403632655/
https://www.zhihu.com/zvideo/1993467902339355470
https://www.zhihu.com/zvideo/1993467902339355470/
https://www.zhihu.com/zvideo/1993467926909572652
https://www.zhihu.com/zvideo/1993467926909572652/
https://www.zhihu.com/zvideo/1993467914888684387
https://www.zhihu.com/zvideo/1993467914888684387/
https://www.zhihu.com/zvideo/1993467910396605561
https://www.zhihu.com/zvideo/1993467910396605561/
https://www.zhihu.com/zvideo/1993467918739056351
https://www.zhihu.com/zvideo/1993467918739056351/
https://www.zhihu.com/zvideo/1993467931108059132
https://www.zhihu.com/zvideo/1993467931108059132/
https://www.zhihu.com/zvideo/1993467922950149500
https://www.zhihu.com/zvideo/1993467922950149500/
https://www.zhihu.com/zvideo/1993467940465557841
https://www.zhihu.com/zvideo/1993467940465557841/
https://www.zhihu.com/zvideo/1993467935461749190
https://www.zhihu.com/zvideo/1993467935461749190/
https://www.zhihu.com/zvideo/1993467987693421182
https://www.zhihu.com/zvideo/1993467987693421182/
https://www.zhihu.com/zvideo/1993467975336997685
https://www.zhihu.com/zvideo/1993467975336997685/
https://www.zhihu.com/zvideo/1993468002998453204
https://www.zhihu.com/zvideo/1993468002998453204/
https://www.zhihu.com/zvideo/1993467959725794270
https://www.zhihu.com/zvideo/1993467959725794270/
https://www.zhihu.com/zvideo/1993467984778375258
https://www.zhihu.com/zvideo/1993467984778375258/
https://www.zhihu.com/zvideo/1993467977727763733
https://www.zhihu.com/zvideo/1993467977727763733/
https://www.zhihu.com/zvideo/1993467962066228715
https://www.zhihu.com/zvideo/1993467962066228715/
https://www.zhihu.com/zvideo/1993468000691576878
https://www.zhihu.com/zvideo/1993468000691576878/
https://www.zhihu.com/zvideo/1993467980064003030
https://www.zhihu.com/zvideo/1993467980064003030/
https://www.zhihu.com/zvideo/1993467969381093391
https://www.zhihu.com/zvideo/1993467969381093391/
https://www.zhihu.com/zvideo/1993467972640057053
https://www.zhihu.com/zvideo/1993467972640057053/
https://www.zhihu.com/zvideo/1993467957163094807
https://www.zhihu.com/zvideo/1993467957163094807/
https://www.zhihu.com/zvideo/1993467998145627466
https://www.zhihu.com/zvideo/1993467998145627466/
https://www.zhihu.com/zvideo/1993467993200558681
https://www.zhihu.com/zvideo/1993467993200558681/
https://www.zhihu.com/zvideo/1993467982450533077
https://www.zhihu.com/zvideo/1993467982450533077/
https://www.zhihu.com/zvideo/1993467967137157772
https://www.zhihu.com/zvideo/1993467967137157772/
https://www.zhihu.com/zvideo/1993467944710193978
https://www.zhihu.com/zvideo/1993467944710193978/
https://www.zhihu.com/zvideo/1993467964599575798
https://www.zhihu.com/zvideo/1993467964599575798/
https://www.zhihu.com/zvideo/1993467949156160784
https://www.zhihu.com/zvideo/1993467949156160784/
https://www.zhihu.com/zvideo/1993468024603313455
https://www.zhihu.com/zvideo/1993468024603313455/
https://www.zhihu.com/zvideo/1993468017619777187
https://www.zhihu.com/zvideo/1993468017619777187/
https://www.zhihu.com/zvideo/1993468027082141720
https://www.zhihu.com/zvideo/1993468027082141720/
https://www.zhihu.com/zvideo/1993468015249999427
https://www.zhihu.com/zvideo/1993468015249999427/
https://www.zhihu.com/zvideo/1993467995620667547
https://www.zhihu.com/zvideo/1993467995620667547/
https://www.zhihu.com/zvideo/1993467953207867127
https://www.zhihu.com/zvideo/1993467953207867127/
https://www.zhihu.com/zvideo/1993467990788834284
https://www.zhihu.com/zvideo/1993467990788834284/
https://www.zhihu.com/zvideo/1993468005343060651
https://www.zhihu.com/zvideo/1993468005343060651/
https://www.zhihu.com/zvideo/1993468007649916854
https://www.zhihu.com/zvideo/1993468007649916854/
https://www.zhihu.com/zvideo/1993468012897014283
https://www.zhihu.com/zvideo/1993468012897014283/
https://www.zhihu.com/zvideo/1993468010074244552
https://www.zhihu.com/zvideo/1993468010074244552/
https://www.zhihu.com/zvideo/1993468019972805570
https://www.zhihu.com/zvideo/1993468019972805570/
https://www.zhihu.com/zvideo/1993468029296727538
https://www.zhihu.com/zvideo/1993468029296727538/
https://www.zhihu.com/zvideo/1993468022258700745
https://www.zhihu.com/zvideo/1993468022258700745/
https://www.zhihu.com/zvideo/1993468033985959137
https://www.zhihu.com/zvideo/1993468033985959137/
https://www.zhihu.com/zvideo/1993468031712657696
https://www.zhihu.com/zvideo/1993468031712657696/

设计保障:ThreadLocal 本身也做了一些努力,比如在 set()、get()、remove() 的时候,会尝试去清理那些 Key 为 null 的过期 Entry。但这是一种“被动清理”,不能完全依赖。
代码层面:尽量将 ThreadLocal 变量声明为 static final,这样它的生命周期就和类一样长,不会被轻易回收,减少了产生 null Key 的机会。但这并不能替代 remove(),因为线程池复用时,上一个任务的值可能会污染下一个任务。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/20 18:22:37

隔离:每个线程有自己的 Thr

一、核心原理 1. 数据存储结构 // 每个 Thread 对象内部都有一个 ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals null;// ThreadLocalMap 内部使用 Entry 数组&#xff0c;Entry 继承自 WeakReference<ThreadLocal<?>> static class Entry extends We…

作者头像 李华
网站建设 2026/2/20 18:37:30

基于Python+Django鲜花店管理系统系统设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/2/23 1:37:28

ego1开发板大作业vivado实战:交通灯控制系统建模与验证

用Vivado在ego1开发板上“点亮”交通灯&#xff1a;从状态机建模到硬件验证的完整实战你有没有试过&#xff0c;只靠几行Verilog代码&#xff0c;让FPGA板子上的LED像真实路口一样自动切换红绿黄&#xff1f;这听起来像是嵌入式高手才玩得转的事——但其实&#xff0c;只要你掌…

作者头像 李华
网站建设 2026/2/21 6:44:11

双主模式I2C在工业系统中的应用:完整示例

双主模式IC如何让工业系统“永不掉线”&#xff1f;一个PLC冗余设计的实战解析你有没有遇到过这样的场景&#xff1a;某条产线突然停机&#xff0c;排查半天才发现是主控MCU通信异常&#xff0c;而整个系统的IC总线也因此陷入瘫痪——所有传感器失联、执行器失控。问题根源往往…

作者头像 李华
网站建设 2026/2/22 13:20:39

数据结构与算法

首先给出一些宏定义#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status; typedef char ElemType;1. 线性表的顺序存储&#xff08;顺序表&#xff09;1.静态顺序表与动态顺序表// 定义静态顺序表的最大…

作者头像 李华
网站建设 2026/2/22 4:25:57

vivado安装教程(Windows):完整版系统配置说明

Vivado安装全攻略&#xff1a;从零搭建高效FPGA开发环境&#xff08;Windows版&#xff09; 你是不是也曾在深夜试图安装Vivado&#xff0c;结果卡在“Error writing to file”上反复重试&#xff1f;或者好不容易装完&#xff0c;一启动就弹出“Could not start the Xilinx L…

作者头像 李华