ThreadLocal和ThreadLocal的内存泄漏问题

首先我们讲一下,ThreadLocal的作用是什么?我们可以把他理解成一个工具,通过他来帮助我们操作Thread中ThreadLoacalMap,注意哈,我们存的数据是存在Thread中的,不是存在ThreadLocal里面的!!

而为什么需要有这个ThreadLocalMap,是因为我们在线程执行的过程中,希望保存一些内容,我在整个线程的生命周期中,可以很方便的去使用。

这个ThreadLocalMap的内部是一个个的Entry对象,和HahsMap一样。

他的key值就是我们的ThreadLocal,而Value就是我们希望保存的值。

也就是说,ThreadLocalMap其实就是一个kv数组,k是我们的ThreadLocal对象,v是我们的值。

他存在两个内存泄漏点,第一个是key值会泄露,也就是我这个ThreadLocal对象用完了,以后不用了,但是我的线程还没有结束,那么这个ThreadLocal也就不能被回收,他的解决方法是将ThreadLocal对象设置为弱引用对象,也就是触发GC了,就清理。

第二个泄漏点,是value泄漏,当key清理了,那么我如何访问这个v呢?k都没了。特别是在一些线程池的场景中,线程会被反复使用,那么如果这个v没有被清理的话,就会一直保存,造成这个泄漏。解决方案是,ThreadLocal使用完了,就手动remove掉,不要留在那里。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值