ThreadLocal
记录线程本地变量,生命周期与线程的生命周期相同
set()方法
public void set(T value) {
// 获取的当前线程
Thread t = Thread.currentThread();
// 获取当前线程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
// 将当前threadLocal实例作为key,值作为val存入map
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
set操作是基于当前线程完成的,Thread类中维护了指向ThreadLocalMap的字段
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;
}
}
// 初始化值 null,记得判空
return setInitialValue();
}
注意事项:一个流程走完,一定要记得手动remove;不可被子线程继承
可被子线程继承的InheritableThreadLocal
该类继承ThreaLocal,与其用法相同
// 线程构造方法的构造流程
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
......
Thread parent = currentThread();
......
// 常见的创建线程,inheritThreadLocals都为true
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
// 将父类线程的本地变量赋值给当前线程
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
}