ThreadLocal实现原理简述

ThreadLocal是线程内共享变量的工具类,它通过在每个线程中维护一个独立的变量副本,实现了线程间的隔离。每个线程的ThreadLocalMap存储ThreadLocal实例及其对应的值。内存溢出可能发生在线程生命周期长于ThreadLocal时,因为Entry的value(强引用)不会被回收,所以需要在使用后及时调用remove方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal是什么

ThreadLocal是一个线程内共享变量工具类。 将线程与该线程存放的对象做一个映射,各个线程之间的变量互不干扰。适用于各个线程依赖不同的变量值完成操作的场景,如:Spring声明式数据库事务、shiro的session

数据结构

ThreadLocal内部结构

在这里插入图片描述

核心机制:
1.每个线程实例中有个threadlocals属性,实际上是个map
2.这个Map中存放的是ThreadLocal实例和Threadlocal实例在该线程中共享的值(value)
3.线程中的Map有ThreadLocal实例维护,由ThreadLocal实例向map中设置和获取值。
3.1 设置值
ThreadLocal实例通过Thread.currentThread获得当前线程实例,自身为key,待设置的值为value组成Entry,放入当前线程实例的map中。
3.2 获取值
ThreadLocal实例通过Thread.currentThread获得当前线程实例,在map中以自身为key,获得对应的value。

从上面的机制中确保threadlocal设置的值,仅在设置时的线程中共享,其它线程无法访问到该线程中设置的值。确保了,1、线程间变量隔离,2、线程内能访问。

内存溢出

当线程实例的生命周期短于ThreadLocal实例的生命周期,threadLocal内存的回收,取决于threadLocal实例的生命周期。而,当线程实例的生命周期长于ThreadLocal实例的生命周期(一般线程池场景)时,thread中ThreadLocalMap的每个Entry的key(对threadLocal的弱引用),在gc时会被回收;然而,Entry中value(强引用)是不会回收。当我们使用ThreadLocal的set方法,要配套进行remove,确保value能及时回收。

参考资料

ThreadLocal-面试必问深度解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值