最近准备找暑期实习,在看Java并发编程的艺术这本书,前面关于JMM的部分还是挺难的,看到第四章,终于进入了并发专题。突然出现了ThreadLocal这个类,一回忆,之前还用过这个类,使用ThreadLocal保存的值,只有在当前线程才可见。
下面介绍一下其实现原理:
首先进入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);
}
首先获取到当前线程t,然后调用了getMap(t),得到一个ThreadLocalMap对象
于是继续追踪getMap()方法
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
getMap方法返回了t线程的threadLocals属性
进入Thread类
ThreadLocal.ThreadLocalMap threadLocals = null;
threadLocals默认为null,所以set方法会调用createMap方法
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
可以发现在createMap方法中,创建了一个ThreadLocalMap对象,其中key为当前ThreadLocal对象,而这个ThreadLocalMap对象为当前Thread的属性
结论
至此,我们发现每个线程都有一个ThreadLocalMap属性,当前线程创建了ThreadLocal对象后,调用其set方法,会将其作为键存入ThreadLocalMap中。