前言
ThreadLcoal提供了一種實現(xiàn)去讓線程創(chuàng)建內(nèi)部變量,而與其他線程隔離開來,這也是保證線程安全的方法之一。
想要實現(xiàn)這種功能,我們很自然會想到讓ThreadLocal去維護一個HashMap,其中key是Thread對象,value是變量值。
但是ThreadLocal并沒有這樣做,而是每個線程維護一個ThreadLcoalMap,key是ThreadLocal對象,value是變量值。這樣做的好處又是什么呢?
源碼分析
set(T value)
public void set(T value) {
//先獲取當前線程
Thread t = Thread.currentThread();
//獲取線程內(nèi)部維護的一個哈希表
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null)
//如果存在,賦值
map.set(this, value);
else
//不存在,先創(chuàng)建再賦值
createMap(t, value);
}
get()
public T get() {
//獲取當前線程
Thread t = Thread.currentThread();
//獲取線程內(nèi)部維護的一個哈希表
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null) {
//從哈希表獲取當前線程的內(nèi)部變量,這里的this是ThreadLocal對象
ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//設(shè)置初始化值,默認為null,可以重寫setInitialValue()方法
return setInitialValue();
}