1.概述
多线程并发时用于存储当前线程的本地变量副本。
2. ThreadLocal解析
public void set(T value)
public T get()
public void remove()
private T setInitialValue()
set:用于存储当前线程的副本变量值
get:获取当前线程的副本变量值
remove:移除ThreadLocalMap中当前线程的副本变量值
setInitialValue:初始化当前线程的副本变量值
具体看源码实现:
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);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
1.获取当前线程
2.去ThreadLocalMap中去取map
3.当map不为空时就将当前副本值和ThreadLocal存入map中
4.当map为空时创建一个ThreadLocalMap,并将当前副本值和ThreadLocal存入map中。
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;
}
}
return setInitialValue();
}
1.获取当前线程。
2.ThreadLocalMap中是否存有当前的线程副本。
3.当map非空时,从ThreadLocalMap中取出Entry,Entry其实就是table数组。然后获取当前ThreadLocal对应的value。
4.初始化一个本地副本变量。
remove方法
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
remove方法很简单
1.从ThreadLocalMap中获取当前线程的map。
2.非空就remove掉,为空什么都不做。
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;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
get方法中会调用到setInitialValue方法。
1.initialValue初始化变量值为protected方法,为子类实现。
2.从当前线程中获取ThreadLocalMap。
3.不为空则将副本值存入当前的ThreadLocal为key的map中。
4.为空就创建。
3. ThreadLocalMap解析
待补充