回顧方式
看源碼
RequestContext->ThreadLocal->Thread->ThreadLocal.ThreadLocalMap
自己的歸納
- Thread中有個(gè)屬性:
ThreadLocal.ThreadLocalMap threadLocals = null;
threadLocals是哈希表,以不同的ThreadLocal實(shí)例為key,對(duì)應(yīng)存儲(chǔ)我們想要線(xiàn)程隔離的值。threadLocals作為T(mén)hread的屬性存儲(chǔ)于Thread內(nèi)部,但Thread自己不維護(hù)這個(gè)屬性。其初始值為null,取值賦值皆由ThreadLocal實(shí)例去維護(hù)- ThreadLocal實(shí)例通過(guò)
Thread.currentThread()找到Thread,進(jìn)而獲取到屬于同一個(gè)包下的Thread的threadLocals,并以this關(guān)鍵字將自己(ThreadLocal實(shí)例)傳入到threadLocals中作為key設(shè)置或獲取對(duì)應(yīng)的值。- 所以,每個(gè)線(xiàn)程中有一個(gè)ThreadLocal.ThreadLocalMap屬性,存儲(chǔ)著各種不同的ThreadLocal實(shí)例,以及這些ThreadLocal實(shí)例對(duì)應(yīng)的值。
ThreadLocal#get()
class ThreadLocal {
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();
}
}
圖解概括

image.png