ThreadLocal.java 部分代码:
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;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
从源码可以看到在调用 ThreadLocal
的 set
方法时,先从 getMap
中,获取当前线程的 threadLocals
,如果不存在则创建一个新的ThreadLocalMap
,key
为this
指的是ThreadLocal
,value
为外部传入需要保存的值。所以值其实是保存在当前线程的 threadLocals
中,因为可以保存多个ThreadLocal
,所以为Map
。
注意:threadLocals
是 Thread
类的一个局部变量,类型为 ThreadLocal.ThreadLocalMap
。
简单点来说就是当前线程的值都是保存在一个Map中,这个Map是这个线程的一个属性,所以每个线程的值相互隔离。
获取值时,也是先获取当前线程中的 threadLocals
再通过当前的 ThreadLocal
为key 获取保存的值