ThreadLocal细节

面经ThreadLocal

是什么?

ThreadLoca用来隔离线程间的信息,提供线程局部变量,每个线程有自己的副本变量多个线程不干扰用来维护线程安全。

实现?

Thread有ThreadLocal.ThreadLocalmap的实例变量threadLocals,每个线程都有一个自己的map用entry数组实现,key是ThreadLocal,value是要存的值,虽然key都一样但是map不一样拿到的值就不一样。

实际上key不是ThreadLocal本身,是一个它的弱引用。每个线程向ThreadLocal存值都是存在了自己的map里,读取用Thread做引用在自己的map找到key来实现线程隔离。

用在哪里?

保留每个线程的用户信息,后台中每一个请求就是一个线程,可以方便获取。

问题?

内存泄露:key是弱引用,所以在gc时会把key变为null但值时强引用,而且Thread一般都不new是直接用线程池里的不会销毁方便复用,所以存在一条强引用链:Thread-map-entry-value导致value无法被回收,内存泄漏。

那么jdk是怎么解决的呢?get,put,remove方法都会每次都会遍历对key为null的数据清除(tips那为什么remove还会存在呢,remove正常是对一个key设为null,清楚是他们几个都有的)

哈希冲突:ThreadLocal没有链表所以不能像Hashmap那样拉链法解决哈希冲突,用的是开放寻址法的线性探测,冲突了向右扫找下一个空位置。

相关推荐
Pniubi4 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko74 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师4 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.4 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼5 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐8 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu8 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO9 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析