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