首先来看ThreadLocal两个最重要的方法,set()和get()。
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(t)得到了他的实例。先看一下getMap是如何实现的。
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
其实Thread类里面有一个内部成员:
ThreadLocal.ThreadLocalMap threadLocals = null;
如果map为null,那么就要createMap。看下createMap是如何实现的:
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
这个ThreadLocalMap到底是什么呢.它其实是ThreadLocal的静态内部类,本质上是以ThreadLocal为key,使用开放地址法的hashmap。
所以每次使用set方法时,先得到调用该方法的线程,取出该线程中ThreadLocalMap(没有则创建),以当前threadLocal为key,取出相应的value。
接下来看下get方法:
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}