从
Thread类源代码入手。
public class Thread implements Runnable { ......//与此线程有关的ThreadLocal值。由ThreadLocal类维护ThreadLocal.ThreadLocalMap threadLocals = null;//与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; ......}从上面
Thread类 源代码可以看出
Thread类中有一个
threadLocals和 一个
inheritableThreadLocals变量,它们都是
ThreadLocalMap类型的变量,我们可以把
ThreadLocalMap理解为
ThreadLocal类实现的定制化的
HashMap。默认情况下这两个变量都是null,只有当前线程调用
ThreadLocal类的
set或
get方法时才创建它们,实际上调用这两个方法的时候,我们调用的是
ThreadLocalMap类对应的
get()、
set()方法。
ThreadLocal类的
set()方法
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }通过上面这些内容,我们足以通过猜测得出结论:最终的变量是放在了当前线程的 ThreadLocalMap
中,并不是存在 ThreadLocal
上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值。
每个Thread中都具备一个ThreadLocalMap,而ThreadLocalMap可以存储以ThreadLocal为key的键值对。 比如我们在同一个线程中声明了两个
ThreadLocal对象的话,会使用
Thread内部都是使用仅有那个
ThreadLocalMap存放数据的,
ThreadLocalMap的 key 就是
ThreadLocal对象,value 就是
ThreadLocal对象调用
set方法设置的值。
ThreadLocal是 map结构是为了让每个线程可以关联多个
ThreadLocal变量。这也就解释了ThreadLocal声明的变量为什么在每一个线程都有自己的专属本地变量。
public class Thread implements Runnable { ......//与此线程有关的ThreadLocal值。由ThreadLocal类维护ThreadLocal.ThreadLocalMap threadLocals = null;//与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; ......}ThreadLocalMap是
ThreadLocal的静态内部类。



