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那样拉链法解决哈希冲突,用的是开放寻址法的线性探测,冲突了向右扫找下一个空位置。

相关推荐
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说11 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了13 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品13 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘13 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记13 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端