ThreadLocal有内存泄漏问题吗

对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客

我这里也简单总结一下:

1. 每个Thread里都存储着一个成员变量,ThreadLocalMap

2. ThreadLocal本身不存储数据,像是一个工具类,基于ThreadLocal去操作ThreadLocalMap

3.ThreadLocalMap本身就是基于Entry[]实现的,因为一个线程可以绑定多个ThreadLocal,这样一来,可能需要存储多个数据,所以采用Entry[]的形式实现

4.每一个线程都有自己的ThreadLocalMap,再基于ThreadLocal对象本身作为key,对value进行存取.

5.ThreadLocalMap的key是一个弱引用,弱引用的特点是:GC回收时,一定会被回收。这里使用弱引用是为了在ThreadLocal对象失去引用之后能被回收,如果是强引用,会导致ThreadLocal对象无法被回收

关于ThreadLocal的内存泄漏问题我们可以通过两个方面进行讨论

我们先看一下ThreadLocal的原理图

 

1. key的内存泄漏

key的是ThreadLocal对象,因为是弱引用,GC的时候就可以被回收掉,所以key的内存泄漏问题通过弱引用的设计就解决了。

2. value的内存泄漏问题

这是我们实际工作中可能面临的问题,如果ThreadLocal对象因为GC被回收了,也就是对应的key失去了引用,变成了null,那value也就无法访问了,如果我们使用的是new出来的线程,等线程执行结束了也就会被整体回收掉了,但是如果使用的是线程池那线程的空间就不会被回收,所以需要自己在使用完ThreadLocal对象后及时调用remove方法,移除Entry即可。这个是面试中关于ThreadLocal的主要考点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值