ThreadLocal原理

ThreadLocal用於保存線程的共享變量

變量的類型可以多樣,通過泛型來指定ThreadLocal<Object>

ThreadLocal有get、set、remove等函數,還有一個ThreadLocalMap內部類,這個是類是核心

代碼結構:

看ThreadLocal源碼,以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);
    }

1:首先獲取當前線程;

2:getMap();getMap()是幹嘛的呢?進代碼發現是獲取當前線程的threadLocals變量,這個threadLocals變量是ThreadLocalMap類型的。說它是Map,其實並不是實現了Map接口,而是使用了Entry,完整是是一個Entry數組。

3:現在我們知道上面的map即threadLocals變量,在執行map.set(this,value);this即當前的ThreadLocal對象,值爲具體的value,key爲ThreadLocal對象。

所以,ThreadLocal的set(T)函數中,首先是拿到當前線程Thread對象中的ThreadLocalMap對象實例threadLocals ,然後再將需要保存的值保存到threadLocals裏面。換句話說,每個線程引用的ThreadLocal副本值都是保存在當前線程Thread對象裏面的。存儲結構爲ThreadLocalMap類型,ThreadLocalMap保存的鍵類型爲ThreadLocal,值爲副本值。

圖:java.lang.ThreadLocal.ThreadLocalMap#set,注意到參數爲ThreadLocal類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章