java面试八股文--ThreadLocal

ThreadLocal在每个线程中创建变量副本,实现线程隔离。它使用ThreadLocalMap存储数据,其中key为弱引用,防止内存溢出。当ThreadLocal不再使用时,应及时调用remove避免内存泄露。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java面试八股文–ThreadLocal

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

当ThreadLocal往里set值时,其实本质是存在里里面的一个ThreadLocalMap中,而map的key就是ThreadLocal,value就是要存储在线程里的变量,这也就是为什么其他线程调用时,拿不到非本线程的数据的原因;
在这里插入图片描述
在这里插入图片描述

在我们去看这个map的时候,发现,其实它的key是一个弱引用
在这里插入图片描述
在这里插入图片描述
此时,就不得不讲一下内存泄露和内存溢出;
内存泄露:内存泄露是指内存中存在GC无法回收的对象,这个对象一直被引用;
内存溢出:是指新的对象进入内存中,但是内存空间已经无法承载此对象进入内存,此时会出现内存溢出的情况;
如果很多情况存在内存泄露,此时就会导致内存溢出的情况;

而ThreadLocal中map涉及key的弱引用就是为了解决内存溢出,当图一中的ThreadLocal强引用不再使用时,此时,ThreadLocal就只存在map涉及的key的弱引用,一但GC过来回收ThreadLocal,发现只涉及弱引用,直接就给干掉了;若在此时变为了强引用,GC就永远无法回收,很多TheadLocal过来之后,就会造成大量的内存泄露,直接导致了内存溢出!

用完ThreadLocal后,一定要调用其remove方法,删除其map里的键值对;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值