ThreadLocal为什么用在成员变量上,方法中对其修改了,但同线程下的ThreadLocal.get()值不会改变。类的初始化线程是一致的啊。使用局部变量可以改变。
下面箭头指的外部修改了,但放成员变量上的话修改不了,不知道为什么。
ThreadLocal为什么用在成员变量上,方法中对其修改了,但同线程下的ThreadLocal.get()值不会改变。类的初始化线程是一致的啊。使用局部变量可以改变。
下面箭头指的外部修改了,但放成员变量上的话修改不了,不知道为什么。
在get方法的实现中,首先获取当前调用者线程,如果当前线程的threadLocals不为null,就直接返回当前线程绑定的本地变量值,否则执行setInitialValue方法初始化threadLocals变量。在setInitialValue方法中,类似于set方法的实现,都是判断当前线程的threadLocals变量是否为null,是则添加本地变量(这个时候由于是初始化,所以添加的值为null),否则创建threadLocals变量,同样添加的值为null。
引用自:https://www.cnblogs.com/fsmly/p/11020641.html#_label0
public T get() {
//1、获取当前线程
Thread t = Thread.currentThread();
//2、获取当前线程的threadLocals变量
ThreadLocalMap map = getMap(t);
//3、如果threadLocals变量不为null,就可以在map中查找到本地变量的值
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//4、执行到此处,threadLocals为null,调用该更改初始化当前线程的threadLocals变量
return setInitialValue();
}
private T setInitialValue() {
//protected T initialValue() {return null;}
T value = initialValue();
//获取当前线程
Thread t = Thread.currentThread();
//以当前线程作为key值,去查找对应的线程变量,找到对应的map
ThreadLocalMap map = getMap(t);
//如果map不为null,就直接添加本地变量,key为当前线程,值为添加的本地变量值
if (map != null)
map.set(this, value);
//如果map为null,说明首次添加,需要首先创建出对应的map
else
createMap(t, value);
return value;
}