从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
的封装,传递了变量值。ThrealLocal
类中可以通过Thread.currentThread()
获取到当前线程对象后,直接通过getMap(Thread t)
可以访问到该线程的ThreadLocalMap
对象。
ThreadLocal
内部维护的是⼀个类似Map
的ThreadLocalMap
数据结构,key
为当前对象的Thread
对象,值为Object
对象。
ThreadLocalMap(ThreadLocal << ? > firstKey, Object firstValue) {
......
}
⽐如我们在同⼀个线程中声明了两个ThreadLocal
对象的话,都是使⽤Thread
内部仅有的那个ThreadLocalMap
存放数据的,ThreadLocalMap
的key
就是ThreadLocal
对象,value
就是ThreadLocal
对象调⽤set
⽅法设置的值。
ThreadLocalMap
是ThreadLocal
的静态内部类。
留言