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

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

一、核心原理
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/1993466103775638758
https://www.zhihu.com/zvideo/1993466103775638758/
https://www.zhihu.com/zvideo/1993466099581354232
https://www.zhihu.com/zvideo/1993466099581354232/
https://www.zhihu.com/zvideo/1993466107844125401
https://www.zhihu.com/zvideo/1993466107844125401/
https://www.zhihu.com/zvideo/1993466111925183141
https://www.zhihu.com/zvideo/1993466111925183141/
https://www.zhihu.com/zvideo/1993466116333392063
https://www.zhihu.com/zvideo/1993466116333392063/
https://www.zhihu.com/zvideo/1993466120322183260
https://www.zhihu.com/zvideo/1993466120322183260/
https://www.zhihu.com/zvideo/1993466133207066179
https://www.zhihu.com/zvideo/1993466133207066179/
https://www.zhihu.com/zvideo/1993466128534623991
https://www.zhihu.com/zvideo/1993466128534623991/
https://www.zhihu.com/zvideo/1993466124638119658
https://www.zhihu.com/zvideo/1993466124638119658/
https://www.zhihu.com/zvideo/1993466137317504863
https://www.zhihu.com/zvideo/1993466137317504863/
https://www.zhihu.com/zvideo/1993466141318869102
https://www.zhihu.com/zvideo/1993466141318869102/
https://www.zhihu.com/zvideo/1993466150965757919
https://www.zhihu.com/zvideo/1993466150965757919/
https://www.zhihu.com/zvideo/1993466147018929547
https://www.zhihu.com/zvideo/1993466147018929547/
https://www.zhihu.com/zvideo/1993466163850655626
https://www.zhihu.com/zvideo/1993466163850655626/
https://www.zhihu.com/zvideo/1993466154895836247
https://www.zhihu.com/zvideo/1993466154895836247/
https://www.zhihu.com/zvideo/1993466188685125412
https://www.zhihu.com/zvideo/1993466188685125412/
https://www.zhihu.com/zvideo/1993466173505950812
https://www.zhihu.com/zvideo/1993466173505950812/
https://www.zhihu.com/zvideo/1993466176106415761
https://www.zhihu.com/zvideo/1993466176106415761/
https://www.zhihu.com/zvideo/1993466180904703408
https://www.zhihu.com/zvideo/1993466180904703408/
https://www.zhihu.com/zvideo/1993466159085934022
https://www.zhihu.com/zvideo/1993466159085934022/
https://www.zhihu.com/zvideo/1993466178534933970
https://www.zhihu.com/zvideo/1993466178534933970/
https://www.zhihu.com/zvideo/1993466183710696750
https://www.zhihu.com/zvideo/1993466183710696750/
https://www.zhihu.com/zvideo/1993466168443412681
https://www.zhihu.com/zvideo/1993466168443412681/
https://www.zhihu.com/zvideo/1993466185933688904
https://www.zhihu.com/zvideo/1993466185933688904/
https://www.zhihu.com/zvideo/1993466199066035825
https://www.zhihu.com/zvideo/1993466199066035825/
https://www.zhihu.com/zvideo/1993466193948975520
https://www.zhihu.com/zvideo/1993466193948975520/
https://www.zhihu.com/zvideo/1993466191570809093
https://www.zhihu.com/zvideo/1993466191570809093/
https://www.zhihu.com/zvideo/1993466196423615108
https://www.zhihu.com/zvideo/1993466196423615108/
https://www.zhihu.com/zvideo/1993466206217344949
https://www.zhihu.com/zvideo/1993466206217344949/
https://www.zhihu.com/zvideo/1993466209023308846
https://www.zhihu.com/zvideo/1993466209023308846/
https://www.zhihu.com/zvideo/1993466213586727686
https://www.zhihu.com/zvideo/1993466213586727686/
https://www.zhihu.com/zvideo/1993466239209739208
https://www.zhihu.com/zvideo/1993466239209739208/
https://www.zhihu.com/zvideo/1993466201641346056
https://www.zhihu.com/zvideo/1993466201641346056/
https://www.zhihu.com/zvideo/1993466211334386870
https://www.zhihu.com/zvideo/1993466211334386870/
https://www.zhihu.com/zvideo/1993466244351939782
https://www.zhihu.com/zvideo/1993466244351939782/
https://www.zhihu.com/zvideo/1993466203977564381
https://www.zhihu.com/zvideo/1993466203977564381/
https://www.zhihu.com/zvideo/1993466216329806676
https://www.zhihu.com/zvideo/1993466216329806676/
https://www.zhihu.com/zvideo/1993466221308444861
https://www.zhihu.com/zvideo/1993466221308444861/
https://www.zhihu.com/zvideo/1993466218561156725
https://www.zhihu.com/zvideo/1993466218561156725/
https://www.zhihu.com/zvideo/1993466246784627160
https://www.zhihu.com/zvideo/1993466246784627160/
https://www.zhihu.com/zvideo/1993466228845614675
https://www.zhihu.com/zvideo/1993466228845614675/
https://www.zhihu.com/zvideo/1993466231332831261
https://www.zhihu.com/zvideo/1993466231332831261/
https://www.zhihu.com/zvideo/1993466223946663287
https://www.zhihu.com/zvideo/1993466223946663287/
https://www.zhihu.com/zvideo/1993466226274484490
https://www.zhihu.com/zvideo/1993466226274484490/
https://www.zhihu.com/zvideo/1993466233920692995
https://www.zhihu.com/zvideo/1993466233920692995/
https://www.zhihu.com/zvideo/1993466236328228797
https://www.zhihu.com/zvideo/1993466236328228797/
https://www.zhihu.com/zvideo/1993466241776628379
https://www.zhihu.com/zvideo/1993466241776628379/
https://www.zhihu.com/zvideo/1993466259245912906
https://www.zhihu.com/zvideo/1993466259245912906/
https://www.zhihu.com/zvideo/1993466249196356593
https://www.zhihu.com/zvideo/1993466249196356593/
https://www.zhihu.com/zvideo/1993466251406766615
https://www.zhihu.com/zvideo/1993466251406766615/
https://www.zhihu.com/zvideo/1993466253684266156
https://www.zhihu.com/zvideo/1993466253684266156/
https://www.zhihu.com/zvideo/1993466263205336986
https://www.zhihu.com/zvideo/1993466263205336986/
https://www.zhihu.com/zvideo/1993466272105661566
https://www.zhihu.com/zvideo/1993466272105661566/
https://www.zhihu.com/zvideo/1993466289017082310
https://www.zhihu.com/zvideo/1993466289017082310/
https://www.zhihu.com/zvideo/1993466276362859836
https://www.zhihu.com/zvideo/1993466276362859836/
https://www.zhihu.com/zvideo/1993466267592578028
https://www.zhihu.com/zvideo/1993466267592578028/
https://www.zhihu.com/zvideo/1993466280355857369
https://www.zhihu.com/zvideo/1993466280355857369/
https://www.zhihu.com/zvideo/1993466284675982653
https://www.zhihu.com/zvideo/1993466284675982653/
https://www.zhihu.com/zvideo/1993466293576307459
https://www.zhihu.com/zvideo/1993466293576307459/
https://www.zhihu.com/zvideo/1993466297963537927
https://www.zhihu.com/zvideo/1993466297963537927/
https://www.zhihu.com/zvideo/1993466302195574102
https://www.zhihu.com/zvideo/1993466302195574102/
https://www.zhihu.com/zvideo/1993466306863845886
https://www.zhihu.com/zvideo/1993466306863845886/
https://www.zhihu.com/zvideo/1993466311016222733
https://www.zhihu.com/zvideo/1993466311016222733/
https://www.zhihu.com/zvideo/1993466315038553975
https://www.zhihu.com/zvideo/1993466315038553975/
https://www.zhihu.com/zvideo/1993466319119614233
https://www.zhihu.com/zvideo/1993466319119614233/
https://www.zhihu.com/zvideo/1993466367635132823
https://www.zhihu.com/zvideo/1993466367635132823/
https://www.zhihu.com/zvideo/1993466345464035297
https://www.zhihu.com/zvideo/1993466345464035297/
https://www.zhihu.com/zvideo/1993466365009479070
https://www.zhihu.com/zvideo/1993466365009479070/
https://www.zhihu.com/zvideo/1993466379937019165
https://www.zhihu.com/zvideo/1993466379937019165/
https://www.zhihu.com/zvideo/1993466362669073639
https://www.zhihu.com/zvideo/1993466362669073639/
https://www.zhihu.com/zvideo/1993466347670225360
https://www.zhihu.com/zvideo/1993466347670225360/
https://www.zhihu.com/zvideo/1993466350312653146
https://www.zhihu.com/zvideo/1993466350312653146/
https://www.zhihu.com/zvideo/1993466340682536094
https://www.zhihu.com/zvideo/1993466340682536094/
https://www.zhihu.com/zvideo/1993466332931453333
https://www.zhihu.com/zvideo/1993466332931453333/
https://www.zhihu.com/zvideo/1993466328602919138
https://www.zhihu.com/zvideo/1993466328602919138/
https://www.zhihu.com/zvideo/1993466342930669707
https://www.zhihu.com/zvideo/1993466342930669707/
https://www.zhihu.com/zvideo/1993466336093937946
https://www.zhihu.com/zvideo/1993466336093937946/
https://www.zhihu.com/zvideo/1993466338329506750
https://www.zhihu.com/zvideo/1993466338329506750/
https://www.zhihu.com/zvideo/1993466357686215176
https://www.zhihu.com/zvideo/1993466357686215176/
https://www.zhihu.com/zvideo/1993466352837611704
https://www.zhihu.com/zvideo/1993466352837611704/
https://www.zhihu.com/zvideo/1993466360232177684
https://www.zhihu.com/zvideo/1993466360232177684/
https://www.zhihu.com/zvideo/1993466375059036109
https://www.zhihu.com/zvideo/1993466375059036109/
https://www.zhihu.com/zvideo/1993466372538250421
https://www.zhihu.com/zvideo/1993466372538250421/
https://www.zhihu.com/zvideo/1993466370239788971
https://www.zhihu.com/zvideo/1993466370239788971/
https://www.zhihu.com/zvideo/1993466405513892438
https://www.zhihu.com/zvideo/1993466405513892438/
https://www.zhihu.com/zvideo/1993466382587818110
https://www.zhihu.com/zvideo/1993466382587818110/
https://www.zhihu.com/zvideo/1993466387851649464
https://www.zhihu.com/zvideo/1993466387851649464/
https://www.zhihu.com/zvideo/1993466398182220105
https://www.zhihu.com/zvideo/1993466398182220105/
https://www.zhihu.com/zvideo/1993466390523437324
https://www.zhihu.com/zvideo/1993466390523437324/
https://www.zhihu.com/zvideo/1993466395711787146
https://www.zhihu.com/zvideo/1993466395711787146/
https://www.zhihu.com/zvideo/1993466385251209507
https://www.zhihu.com/zvideo/1993466385251209507/
https://www.zhihu.com/zvideo/1993466393446864582
https://www.zhihu.com/zvideo/1993466393446864582/
https://www.zhihu.com/zvideo/1993466377433001991
https://www.zhihu.com/zvideo/1993466377433001991/
https://www.zhihu.com/zvideo/1993466411352343647
https://www.zhihu.com/zvideo/1993466411352343647/
https://www.zhihu.com/zvideo/1993466400585560509
https://www.zhihu.com/zvideo/1993466400585560509/
https://www.zhihu.com/zvideo/1993466408370194295
https://www.zhihu.com/zvideo/1993466408370194295/
https://www.zhihu.com/zvideo/1993466403190239286
https://www.zhihu.com/zvideo/1993466403190239286/
https://www.zhihu.com/zvideo/1993466414011549457
https://www.zhihu.com/zvideo/1993466414011549457/

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

http://www.cnnetsun.cn/news/544222.html

相关文章:

  • 基于Python+Django鲜花店管理系统系统设计与实现
  • ego1开发板大作业vivado实战:交通灯控制系统建模与验证
  • 双主模式I2C在工业系统中的应用:完整示例
  • 数据结构与算法
  • vivado安装教程(Windows):完整版系统配置说明
  • 计算机毕业设计springboot大学四六级英语考试自主学习平台 基于Spring Boot的高校英语四六级在线自学系统 Spring Boot驱动的大学英语等级考试个性化学习平台
  • 解决screen驱动花屏问题的实战经验
  • 工业环境下的PCB封装防护设计:通俗解释
  • 基于Proteus仿真的STC89C52RC最小系统搭建教程
  • JLink驱动安装方法:新手友好型操作指南
  • Linux安装RabbitMQ
  • Linux安装redis
  • Vivado IP核实现SPI通信协议:深度剖析时序配置
  • 探究大数据领域数据工程的分布式计算模式
  • 完整示例:Proteus中构建独立按键+数码管电路
  • 救命神器2026 TOP10 AI论文软件:专科生毕业论文救星测评
  • 快速理解交叉编译工具链三元组:工业嵌入式入门必看
  • Keil5智能感知配置实战:从零实现自动补全
  • 基于nodejs+Vue学生社团管理系统的设计与实现_33x07u9r
  • C++ 结构体(struct)
  • STM32驱动8位并口LCD显示屏操作指南
  • 论文查重优化的现代方法:六款AI工具实现高效文本改写的操作步骤
  • 通过AI技术提升论文原创性:六大智能工具改写文本的实用技巧解析
  • 借助10款AI论文写作工具,高效复现数学建模领域的优秀论文,同时通过智能改写提升内容质量。
  • 提升论文原创性的有效方法:六款AI工具改写文本的实用操作指南
  • 学术查重未通过?五个关键方法帮你快速降低重复比例。
  • 亲测好用9个AI论文软件,助你搞定研究生毕业论文!
  • 论文查重不合格?五个高效步骤帮你快速调整文本。
  • AO3镜像站终极部署指南:3步实现稳定访问同人作品库
  • 论文写作效率翻倍:9款AI辅助工具深度体验评测