ThreadLocal实现原理

ThreadLocal 是 Java 中实现线程封闭(Thread Confinement)的核心机制,它通过为每个线程创建变量的独立副本来解决多线程环境下的线程安全问题。

复制代码
Thread
└── ThreadLocalMap (threadLocals)  // 每个线程持有的专属Map
    ├── Entry[] table              // 哈希表结构
    │   └── Entry extends WeakReference<ThreadLocal<?>>
    │       ├── ThreadLocal<?> key  // 弱引用Key
    │       └── Object value       // 强引用Value
    └── 其他HashMap类似字段

threadlocal里的数据是怎么存储的?

每个线程内部有一个专属、私有的ThreadLocalMap(就是一个hashMap,底层用Entry数组存数据)

value:要保存的资源

调用set方法时,就是以当前ThreadLocal对象为key,以资源为value,放到ThreadLocalMap中

调用get方法时,就是以当前ThreadLocal对象为key,从ThreadLocalMap中取value

开发中一般把ThreadLocal声明为static,这样ThreadLocal对象是线程共享的,那key都共享了,不同线程取出来的value不就是同一个吗?

并不是。ThreadLocalMap是每个线程私有的

复制代码
[正确模型]
static ThreadLocal实例(作为Key)
├── 线程1的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueA)
├── 线程2的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueB)
└── 线程3的ThreadLocalMap: Entry(Key=ThreadLocal实例 → ValueC)

为什么key是弱应用?

要避免key的内存泄露问题

情况1:new Thread()的情况,用完正常销毁,那么ThreadLocalMap会被GC正常回收,不会出现内存泄露。

情况2:使用线程池结合ThreadLocal的情况(这个使用更常见,不需要频繁创建,可以复用),线程池中的线程不会销毁会一致复用。

弱引用Key,GC时ThreadLocal无强引用,回收Key防止Map持续增长

key只有弱引用时,只要发生了垃圾回收,ThreadLocalMap就会回收,避免内存泄露问题


ThreadLocalMap中如何清理大量为null的数据 ?

在调用set、get、remove方法时,就会遍历数组,清除为null的entry,然后通过线性探测重新处理hash冲突

为什么value是强引用?

将数据存到value中,是为了要用它,如果不是强引用,就会被GC回收

那value怎么回收呢?

不回收会导致内存泄露

所以,在使用完ThreadLocal后必须断开强引用,即调用remove方法手动断开强引用,让gc把它回收了

相关推荐
机器人零零壹2 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
布莱克6053 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
LabVIEW开发3 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
benchmark_cc4 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
ZhengEnCi5 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
Zenova EdgeOS5 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法