ThreadLocal是什么

threadlocal是什么 threadlocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。
下图为threadlocal的内部结构图
从上面的结构图,我们已经窥见threadlocal的核心机制:
每个thread线程内部都有一个map。 map里面存储线程本地对象(key)和线程的变量副本(value) 但是,thread内部的map是由threadlocal维护的,由threadlocal负责向map获取和设置线程的变量值。 所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ threadlocalmap threadlocalmap是threadlocal的内部类,没有实现map接口,用独立的方式实现了map的功能,其内部的entry也独立实现。
和hashmap的最大的不同在于,threadlocalmap结构非常简单,没有next引用,也就是说threadlocalmap中解决hash冲突的方式并非链表的方式,而是采用线性探测的方式。(threadlocalmap如何解决冲突? )
在threadlocalmap中,也是用entry来保存k-v结构数据的。但是entry中key只能是threadlocal对象,这点被entry的构造方法已经限定死了。
static class entry extends weakreference {    /** the value associated with this threadlocal. */    object value;    entry(threadlocal k, object v) {        super(k);        value = v;    }} 注意了!!
entry继承自weakreference(弱引用,生命周期只能存活到下次gc前),但只有key是弱引用类型的,value并非弱引用。(问题马上就来了)
由于threadlocalmap的key是弱引用,而value是强引用。这就导致了一个问题,threadlocal在没有外部对象强引用时,发生gc时弱引用key会被回收,而value不会回收。
当线程没有结束,但是threadlocal已经被回收,则可能导致线程中存在threadlocalmap的键值对,造成内存泄露。(threadlocal被回收,threadlocal关联的线程共享变量还存在)。
基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/yudao-cloud 视频教程:https://doc.iocoder.cn/video/ 如何避免泄漏 为了防止此类情况的出现,我们有两种手段。
1、使用完线程共享变量后,显示调用threadlocalmap.remove方法清除线程共享变量;
既然key是弱引用,那么我们要做的事,就是在调用threadlocal的get()、set()方法时完成后再调用remove方法,将entry节点和map的引用关系移除,这样整个entry对象在gc roots分析后就变成不可达了,下次gc的时候就可以被回收。
2、jdk建议threadlocal定义为private static,这样threadlocal的弱引用问题则不存在了。


问答专场│硬盘数据丢失,还能恢复吗?(文末开奖)
华为旗舰P30超清图片曝光
为什么购买燃油车的花费要远低于纯电动汽车?
激光技术及解决方案供应商相干2020年报:净亏损4.14亿美元
曝NVIDIA将在明年CES2020发布GeForce Super笔记本显卡 升级为GDDR6显存
ThreadLocal是什么
minicircuits射频均衡器TAT-4R8DC-1+
MDGC/GCMS系列 气相色谱系统
为什么中国能够引领世界的5G发展
低代码开发平台对企业有什么意义
在物流行业中蓬勃发展的人工智能
iphone8什么时候上市?史上最贵苹果手机?
卫星导航系统的发展已经到达了一个新的高度
北京国际电机展丨ADI智能电机传感器解决方案助力电机智能维护
暖芯迦填补我国相关生物芯片领域空白
无尘室中常见发尘源的分析与维护
大基金今后的投资发展思路将是“补短板”、“增长板”
以太网怎么连接
维信诺发布柔性全面屏新品 首次现身数字中国建设峰会 惊讶全场
模拟电路的基本概念和实际应用案例