ThreadLocal是一个线程本地变量,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。
每个线程Thread类都有个属性ThreadLocalMap,用来维护该线程的多个ThreadLocal变量,该Map是自定义实现的Entry[]数组结构,并非继承自原生Map类,Entry其中Key即是ThreadLocal变量本身,Value则是具体该线程中的变量副本值,ThreadLocal叫做线程本地变量在Thread类中,我们可以找到如上信息,变量名:threadLocals,复数说明一个线程可以有多个threadLocal,也就是说ThreadLocal.ThreadLocalMap可以保存多个ThreadLocal;
图片说明

Entry的Key即ThreadLocal对象是采用弱引用引入的

图片说明
图片说明
这里的threadlocal是一个弱引用对象。

对对象进行弱引用不会影响垃圾回收器回收该对象,即如果一个对象只有弱引用存在了,则下次GC将会回收掉该对象(不管当前内存空间足够与否)。如果你用弱引用还是会还是会存在内存泄露问题,除非最后内存不够才会将他们回收掉

假如使用强引用,当ThreadLocal不再使用需要回收时,发现某个线程中ThreadLocalMap存在该ThreadLocal的强引用,无法回收,造成内存泄漏。

因此,使用弱引用可以防止长期存在的线程(通常使用了线程池)导致ThreadLocal无法回收造成内存泄漏。

value 的泄***r>value 是一个强引用对象。
图片说明
图片说明
图片说明