一、概述

ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。

解决的是在当前线程中,有属于自己的变量,可以存储数据,例如可以使用ThreadLocal存储当前登录用户的信息

二、构造方法

三、常用方法

  • 如果需要初始化一个值,建议使用withInitial(),并且设置为static设置初始值,避免引起空指针

static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
  • 如果使用完成时候,使用remove()方法将数据移除,以免引起OOM,尤其在线程池场景下

  • set()getEntry()remove()方法,在threadLocal的生命周期里,针对threadLocal存在的内存泄漏的问题,都会通过expungeStaleEntrycleanSomeSlotsreplaceStaleEntry这三个方法清理掉key为null脏entry

四、Thread和ThreadLocal和ThreadLocalMap区别

五、引用区别

强引用:一般new出来的对象,都是强引用,只有JVM检测到没有引用的时候才会触发GC回收,是造成OOM的主要原因

软引用(SoftReference):JVM内存够用不回收,不够用就回收掉

弱引用(WeakReference):GC执行就会回收弱引用对象,不管内存是否够用

虚拟引用(PhantomReference):一种标记引用,当对象被销毁之后会进入ReferenceQueue队列中,可用于对象销毁之后的通知,从而进行后续操作