ThreadLocal的简单用法
ThreadLocal源码解析:
// ThreadLocal的get方法
public T get() {
// 首先获取相当线程,因此不管ThreadLocal对象是在哪个线程new的,
// 调用get方法是,获取的都是当前线程保存的值
Thread t = Thread.currentThread();
// 获取当前线程Thread对象的ThreadLocalMap成员变量,是一个Map对象,线程局部变量就保存在这个Map中
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
// 如果已经保存过局部变量了,e!=null,直接return
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
// 没有存储过局部变量,调用initialValue返回一个默认值
return setInitialValue();
}
// getMap方法只是返回Thread对象的threadLocals变量,默认等于null
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
// setInitialValue方法内部调用initValue方法,就是我们上面重写的方法
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
// 如果map不等于null,将默认值保存在map中
if (map != null)
map.set(this, value);
else
createMap(t, value); // 否则创建map
return value;
}
// 创建map,并且保存初始值
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
// set方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
// 如果map不等于null,重设value值
if (map != null)
map.set(this, value); // map的key值是ThreadLocal对象
else
createMap(t, value); // 否则创建map
}