一、概述
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
队列中,可用于对象销毁之后的通知,从而进行后续操作