@[toc]
前言
- ThreadLocal 想必大家都非常熟悉了,這個不再多做ThreadLocal 的使用案例,,如果有不熟悉的小夥伴 可以閱讀
- https://blog.csdn.net/qq_41977838/article/details/105766305
ThreadLocal的源碼
本節 我們詳細了解ThreadLocal的源碼,讓大家更為了解ThreadLocal
ThreadLocalMap

ThreadLocal中的嵌套内部類ThreadLocalMap,這個類本質上是一個map,和HashMap之類的實作相似,依然是key-value的形式,其中有一個内部類Entry,其中key可以看做是ThreadLocal執行個體,但是其本質是持有ThreadLocal執行個體的弱引用
ThreadlocalMap 會發現他是ThreadLocal 的一個内部類,
會發現他有一個Entry
**Entry繼承WeakReference,使用弱引用,可以将ThreadLocal對象的生命周期和線程生命周期解綁,持有對ThreadLocal的弱引用,可以使得ThreadLocal在沒有其他強引用的時候被回收掉,這樣可以避免因為線程得不到銷毀導緻ThreadLocal對象無法被回收。并且
他是 以key value 形式的Entry **
有興趣的同學可以打開 底層源碼看下具體實作
initialValue
initialValue ThreadLocal初始化的方法,預設為 null ,可以重寫
get 方法
會發現他把 Thread.currentThread(); 傳到 getMap() 方法中,
調用Thread 類 中定義的 Threadlocal.ThreadlocalMap() 傳回一個map
判斷目前線程的map是否存在,不為空, 擷取目前Entry 執行個體,
判斷這個鍵值對是否為空
如果不是空,就傳回對應的value值
此處是目前線程的map不存在,傳回setInitialValue,為空傳回初始化值
這裡有個非常重要的知識,initialValue 是使用懶加載 ,隻有調用 get 的時候才會 使用initialValue 方法,在 new ThreadLocal 中是不會初始化的
private T setInitialValue() {
//擷取初始化值,預設為null(如果沒有子類進行覆寫)
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
//不為空不用再初始化,直接調用set操作設值
if (map != null)
map.set(this, value);
else
//第一次初始化,createMap在上面介紹set()的時候有介紹過。
createMap(t, value);
return value;
}
接下來我們看下 set的方法
set方法
判斷目前線程的map是否存在,如果ThreadLocal中有這個map,就把目前類和對應的值傳進去
如果沒有這個map,就建立一個t線程的ThreadLocalMap,并将value值傳進去
remove方法
remove方法就比較簡單了