Threadlocal那些事儿

TreadLocal是什么?能做什么?实现原理是什么?

这个问题困扰了很长一段时间,了解过一些后又忘了。今天突然想仔细了解深入一点到底它是个什么东西,感觉自己也有一知半解了,所以想把它记录下来。

其实理解ThreadLocal并不难,因为ThreadLocal它不是独立使用的,只有线程调用的时候才会体现它的价值。

Thread类里面维护着一个map,叫ThreadLocalMap。这个map的结构是ThreadLocal对象为key,线程的本地副本变量为value。这里的ThreadLocal是一个弱引用。什么是弱引用就是在gc的时候有可能会被回收的对象。后面会提到关于ThreadLocal的内存泄露问题。所以当我们在获取线程的本地变量值的时候,只会获取到当前线程的。因为每个Thread里面都有一个这样的map。

关于内存泄漏是因为当我们的map里的key——ThreadLocal生命周期和value不同,当gc的时候如果threadLocal被回收,而强引用线程对象还在执行,我们的value是没有价值的且不会被gc的。所以会造成内存泄漏。那么问题来了,如果我们的value也是一个弱引用,是不是会避免内存泄漏问题。答案是不一定。因为前面提到弱引用在gc的时候回收是有可能,而不是一定被回收。希望有人能帮忙解读一下为什么ThreadLocalMap的value为什么不是一个弱引用。

当然我们可以在调用ThreadLocal的get、set方法是最后remove掉这个对象可以避免内存泄漏了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值