每次看到ThreadLocal总要重新复习一下源码,今天总结一下:
每个Thread类中有ThreadLocal.ThreadLocalMap threadLocals = null;这样的成员变量,ThreadLocalMap 是ThreadLocal的一个内部类,其中存储了当前ThreadLocal以及对应的value,这个threadLocals其实是一个map类型,会存储好多个键值对,相当于存储好多个ThreadLocal 对应的值
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);//这个this是当前的ThreadLocal对象,每一次就把当前的ThreadLocal对应的值存入map
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);//如果还没有这个map,就创建,一个线程对应一个map,但map中可以存好多ThreadLocal变量
}
可以这么理解,每个Thread类中都有自己当前的map,每个map可以存储多对ThreadLocal,而键就是ThreadLocal对象,值就是所存的值