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

相关推荐
今天_也很困1 小时前
LeetCode热题100-560. 和为 K 的子数组
java·算法·leetcode
在繁华处1 小时前
线程进阶: 无人机自动防空平台开发教程V2
java·无人机
A懿轩A1 小时前
【Java 基础编程】Java 变量与八大基本数据类型详解:从声明到类型转换,零基础也能看懂
java·开发语言·python
m0_740043731 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
@ chen2 小时前
Spring事务 核心知识
java·后端·spring
aithinker2 小时前
使用QQ邮箱收发邮件遇到的坑 有些WIFI不支持ipv6
java
星火开发设计2 小时前
C++ 预处理指令:#include、#define 与条件编译
java·开发语言·c++·学习·算法·知识
Hx_Ma162 小时前
SpringMVC返回值
java·开发语言·servlet
Yana.nice2 小时前
openssl将证书从p7b转换为crt格式
java·linux
独自破碎E3 小时前
【滑动窗口+字符计数数组】LCR_014_字符串的排列
android·java·开发语言