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

相关推荐
没有bug.的程序员2 小时前
JVM 内存模型(JMM):并发的物理基础
java·jvm·spring boot·spring·jmm
毕设源码-郭学长2 小时前
【开题答辩全过程】以 基于SSM框架的线上购物系统设计与实现为例,包含答辩的问题和答案
java·spring boot
信码由缰2 小时前
Java 中的结构化并发模式
java
Q***f6352 小时前
Java数据可视化应用
java·开发语言·信息可视化
一个尚在学习的计算机小白2 小时前
springcache缓存
java·spring·缓存
hygge9992 小时前
synchronized vs CopyOnWrite 系列
java·开发语言·经验分享·面试
用户0304805912632 小时前
前后端数据传输: 利用 Jackson 注解实现 Enum 与 int 的双向映射
java·后端
Rhys..2 小时前
Jenkinsfile保存在项目根目录下的好处
java·开发语言
讨厌下雨的天空3 小时前
线程同步与互斥
java·开发语言