一、概述
ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。
解决的是在当前线程中,有属于自己的变量,可以存储数据,例如可以使用ThreadLocal存储当前登录用户的信息

二、构造方法

三、常用方法

如果需要初始化一个值,建议使用
withInitial(),并且设置为static,设置初始值,避免引起空指针
static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);如果使用完成时候,使用
remove()方法将数据移除,以免引起OOM,尤其在线程池场景下set(),getEntry(),remove()方法,在threadLocal的生命周期里,针对threadLocal存在的内存泄漏的问题,都会通过expungeStaleEntry,cleanSomeSlots,replaceStaleEntry这三个方法清理掉key为null的脏entry
四、Thread和ThreadLocal和ThreadLocalMap区别
五、引用区别

强引用:一般new出来的对象,都是强引用,只有JVM检测到没有引用的时候才会触发GC回收,是造成OOM的主要原因
软引用(SoftReference):JVM内存够用不回收,不够用就回收掉
弱引用(WeakReference):GC执行就会回收弱引用对象,不管内存是否够用
虚拟引用(PhantomReference):一种标记引用,当对象被销毁之后会进入ReferenceQueue队列中,可用于对象销毁之后的通知,从而进行后续操作

