ThreadLocal是什么?
ThreadLocal,线程本地变量,也叫线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLocal是用来维护线程中的变量不被其他线程干扰而出现的一个结构,内部包含一个ThreadLocalMap类,该类为Thread类的一个局部变量,该Map存储的key为ThreadLocal对象自身,value为我们要存储的对象,这样一来,在不同线程中,持有的其实都是当前线程的变量副本,与其他线程完全隔离,以此来保证线程执行过程中不受其他线程的影响。
ThreadLocal结构:

四个主要的方法:
/**
* 设置当前线程的线程局部变量的值。
*/
void set(Object value);
/**
* 该方法返回当前线程所对应的线程局部变量。
*/
public Object get();
/**
* 将当前线程局部变量的值删除,目的是为了减少内存的占用,
* 该方法是JDK 5.0新增的方法。
* 需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,
* 所以显式调用该方法清除线程的局部变量并不是必须的操作,
* 但它可以加快内存回收的速度。
*/
public void remove();
/**
* 返回该线程局部变量的初始值,该方法是一个protected的方法,
* 显然是为了让子类覆盖而设计的。
* 这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。
* ThreadLocal中的缺省实现直接返回一个null。
* @return
*/
protected Object initialValue();
ThreadLocal内存泄漏问题:
每一个线程对资源副本都有一个weekRefrence:只要线程还在运行,使用ThreadLocal就是可以获取的。当一个线程运行结束销毁时,所有的资源副本都是可以被垃圾回收的(ThreadLocalMap对象保存在Thread对象中,当某个线程终止后,存储在其中的线程隔离的变量,也将作为Thread实例的垃圾被回收掉,所以完全不用担心内存泄漏的问题),这段注释表明,ThreadLocal的使用是不会造成内训泄露的。
参考:https://www.cnblogs.com/xzwblog/p/7227509.html