ThreadMap.Entry为什么要把key设置为弱引用

1、TheadLocal调用链

答:ThreadLocal ->Thead -> ThreadMap -> TheadMap.Entry(ThreadLocal<T> t,T value);

2、ThreadLocal.entry为什么要弱引用

答:static class Entry extends weakReference<ThreadLocal<?>> 对ThreadLocal进行弱引用的目的是:

多线程的情况下,如果不对ThreadLocal弱引用,那么Entry一直保持着对ThreadLocal的强引用,那么在使用完以后,线程没有结束,那么引用一直存在,会导致内存泄漏,但是如果是弱引用,可以把Entry的Key清除了,然后等待调用remove(),put(),get()方法时,会调用cleanSomeSlots()、expungStaleEntry()方法,把Key为Null的Entry清除.

3、那ThreadLocal.entry对ThreadLocal的弱引用,不会让TheadLocal被回收,然后导致Get的时候为空么

答:实际上这里面是两个概念,首先,ThreadLocal对象有着两个引用,一个是new 出来的时候创建的引用,假设为a,一个是Entry的引用,假设为b,如果a被手动释放了,那么b是不是也没有存在的意义了?但是如果Entry保持对threadLocal的强引用,那么Thread->ThreadMap->Entry的引用链会导致它的生命周期跟线程是一致的,那么如果ThreadLocal里面保存的是大对象,那么在多线程的情况下会有内存泄漏的风险。那么回到正题,如果Entry是对ThreadLocal的弱引用,那么引用a在手动释放以后,是不是这个对象的引用只剩b了,那么在下一次垃圾回收的时候,这个threadLocal对象是不是就可以被回收了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值