1.概述
多線程并發(fā)時用于存儲當前線程的本地變量副本偶芍。
2. ThreadLocal解析
public void set(T value)
public T get()
public void remove()
private T setInitialValue()
set:用于存儲當前線程的副本變量值
get:獲取當前線程的副本變量值
remove:移除ThreadLocalMap中當前線程的副本變量值
setInitialValue:初始化當前線程的副本變量值
具體看源碼實現(xiàn):
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為空時創(chuàng)建一個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數(shù)組如失。然后獲取當前ThreadLocal對應(yīng)的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方法中會調(diào)用到setInitialValue方法。
1.initialValue初始化變量值為protected方法板惑,為子類實現(xiàn)橄镜。
2.從當前線程中獲取ThreadLocalMap。
3.不為空則將副本值存入當前的ThreadLocal為key的map中冯乘。
4.為空就創(chuàng)建洽胶。
3. ThreadLocalMap解析
待補充