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

相关推荐
大阿明21 小时前
Spring Boot(快速上手)
java·spring boot·后端
bearpping21 小时前
Java进阶,时间与日期,包装类,正则表达式
java
邵奈一21 小时前
清明纪念·时光信笺——项目运行指南
java·实战·项目
sunwenjian88621 小时前
Java进阶——IO 流
java·开发语言·python
sinat_2554878121 小时前
读者、作家 Java集合学习笔记
java·笔记·学习
皮皮林5511 天前
如何画出一张优秀的架构图?(老鸟必备)
java
百锦再1 天前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven
森林猿1 天前
java-modbus-读取-modbus4j
java·网络·python
tobias.b1 天前
计算机基础知识-数据结构
java·数据结构·考研
reembarkation1 天前
光标在a-select,鼠标已经移出,下拉框跟随页面滚动
java·数据库·sql