天天看點

ThreadLocal源碼解析前言ThreadLocal的源碼

@[toc]

前言

ThreadLocal的源碼

本節 我們詳細了解ThreadLocal的源碼,讓大家更為了解ThreadLocal

ThreadLocalMap

ThreadLocal源碼解析前言ThreadLocal的源碼

ThreadLocal中的嵌套内部類ThreadLocalMap,這個類本質上是一個map,和HashMap之類的實作相似,依然是key-value的形式,其中有一個内部類Entry,其中key可以看做是ThreadLocal執行個體,但是其本質是持有ThreadLocal執行個體的弱引用

ThreadLocal源碼解析前言ThreadLocal的源碼

ThreadlocalMap 會發現他是ThreadLocal 的一個内部類,

會發現他有一個Entry

**Entry繼承WeakReference,使用弱引用,可以将ThreadLocal對象的生命周期和線程生命周期解綁,持有對ThreadLocal的弱引用,可以使得ThreadLocal在沒有其他強引用的時候被回收掉,這樣可以避免因為線程得不到銷毀導緻ThreadLocal對象無法被回收。并且

他是 以key value 形式的Entry **

有興趣的同學可以打開 底層源碼看下具體實作

initialValue

ThreadLocal源碼解析前言ThreadLocal的源碼

initialValue ThreadLocal初始化的方法,預設為 null ,可以重寫

ThreadLocal源碼解析前言ThreadLocal的源碼

get 方法

會發現他把 Thread.currentThread(); 傳到 getMap() 方法中,

ThreadLocal源碼解析前言ThreadLocal的源碼

調用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方法

ThreadLocal源碼解析前言ThreadLocal的源碼

判斷目前線程的map是否存在,如果ThreadLocal中有這個map,就把目前類和對應的值傳進去

如果沒有這個map,就建立一個t線程的ThreadLocalMap,并将value值傳進去

remove方法

ThreadLocal源碼解析前言ThreadLocal的源碼

remove方法就比較簡單了

繼續閱讀