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对象是不是就可以被回收了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,ThreadLocal类可以让每个线程都拥有自己的变量副本,避免线程安全问题。在ThreadLocal中,使用一个Entry数组来存放每个线程对应的值,其中Entrykey弱引用,value为强引用。这样,当ThreadLocal实例被垃圾回收时,对应的Entry数组也会被清理掉,从而避免内存泄漏问题。 以下是一个使用ThreadLocal的示例代码,其中ThreadLocalkey弱引用: ```java public class MyThreadLocal<T> { private Map<Thread, T> threadMap = new HashMap<>(); private ThreadLocal<Map<Thread, T>> threadLocal = new ThreadLocal<Map<Thread, T>>() { @Override protected Map<Thread, T> initialValue() { return new HashMap<>(); } }; public void set(T value) { threadMap.put(Thread.currentThread(), value); threadLocal.set(threadMap); } public T get() { Map<Thread, T> map = threadLocal.get(); return map.get(Thread.currentThread()); } public void remove() { Map<Thread, T> map = threadLocal.get(); map.remove(Thread.currentThread()); } } ``` 在上述代码中,我们使用了一个Map来存放每个线程对应的值,并且将这个Map设置ThreadLocal中。在set方法中,我们将当前线程和对应的值存放到这个Map中,并且更新ThreadLocal的值。在get方法中,我们获取ThreadLocal中对应的Map,并且返回当前线程对应的值。在remove方法中,我们获取ThreadLocal中对应的Map,并且移除当前线程对应的值。由于ThreadLocalkey弱引用,因此当ThreadLocal实例被垃圾回收时,对应的Entry数组也会被清理掉,从而避免内存泄漏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值