ThreadLocal 是把对象交给当前线程管理。
每个Thread里有个ThreadLocalMap,内部为Entry数组,每个Entry的key为一个ThreadLocal实例,value为需要管理的对象。所以交给ThreadLocal管理的对象只与当前线程有关。
1、ThreadLocal的set方法
public void set(T value) {
// 获取当前线程
Thread t = Thread.currentThread();
// 每个Thread 内部维护一个ThreadLocalMap
// 每个ThreadLocalMap内部维护一个Entry
// Entry的 key为 ThreadLocal,value 为一个Object
ThreadLocalMap map = getMap(t);
if (map != null)
// 当前线程的ThreadLocalMap 已经存在
// this 代表当前的 ThreadLocal对象
// 每个 ThreadLocalMap 会有很多ThreadLocal
// 所以Thread 是通过ThreadLocalMap 管理ThreadLocal 和他对应的Object
map.set(this, value);
else
// 实例化当前线程的ThreadLocalMap,并把ThreadLocal 和 对象放进去
createMap(t, value);
}
2、 ThreadLocal的get方法
public T get() {
// 获取当前线程
Thread t = Thread.currentThread();
// 获取当前线程的 ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
// 获取存放当前ThreadLocal 的Entity
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
// 取得ThreadLocal 对应的Object
T result = (T) e.value;
return result;
}
}
// 初始化ThreadLocal, 设对应的Object为null
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
protected T initialValue() {
return null;
}