ThreadLocal源碼解析

一.ThreadLocal簡介
ThreadLocal 提供了線程局部變量否纬,提供的局部變量與其他的變量不同狈惫,每個線程都可以通過set與get方法來訪問獨立初始化變量副本。
ThreadLocal 可以理解為線程本地變量暑始,如果定義了一個ThreadLocal對象伴鳖, 每個線程中的ThreadLocal讀寫是線程隔離的,相互不影響锯梁,它提供了一種將可變數(shù)據通過每個線程有自己的獨立副本從而實現(xiàn)線程封閉的機制

包路徑:java.lang.ThreadLocal

image.png

二.ThreadLocal相關類

ThreadLocal中嵌套內部類ThreadLocalmap ,這個類本質上就是一個map即碗,與HashMap之類的實現(xiàn)相似,依然是Key-Value的形式陌凳,其中一個內部類Entry ,其中key可以看做是ThreadLocal實例剥懒,但是其本質是持有ThreadLocal的實例弱引用對象

image.png

在ThreadLocalMap中并沒有對于ThreadLocalMap的引用,而是ThreadLocalMap在Thread類中合敦,每個線程都向ThreadLocal里面塞值的時候初橘,其實都是向自己持有的ThreadLocalMap里面寫入數(shù)據,讀的時候同理充岛,首先從自己線程中取出自己持有的ThreadLocalMap,然后再根據ThreadLocal引用作為key取出Value保檐,ThreadLocal實現(xiàn)了變量的線程隔離

image.png

Thread 源碼部分截圖

UML類圖

image.png
image.png

ThreadLocal原理圖

image.png

首先主線程定義的兩個ThreadLocal變量 ,兩個子線程 線程A和線程B
線程A和線程B 分別持有一個ThreadLocalMap 用于保存自己的副本崔梗,主線程的ThreadLocal中封裝了set和get方法
在線程A和線程B中調用ThreadLocal的Set方法夜只,會首先通過getMap(Thread.currentThread)獲取到線程A或者線程B持有的ThreadLocalMap對象,在調用map.put方法蒜魄,并將ThreadLocal作為key扔亥,將要存儲的數(shù)據作為value 來存放
get和set原理是類似,先獲取當前調用線程的ThreadLocalMap,在從map中獲取value ,并將ThreadLocal作為key

三.ThreadLocalMap源碼分析
在分析ThreadLocalMap 的同時谈为,結合ThreadLocal的方法一起進行分析

       private static final int INITIAL_CAPACITY = 16;
        private ThreadLocal.ThreadLocalMap.Entry[] table;
        private int size;
        private int threshold;

        private void setThreshold(int var1) {
            this.threshold = var1 * 2 / 3;
        }

        private static int nextIndex(int var0, int var1) {
            return var0 + 1 < var1 ? var0 + 1 : 0;
        }

        private static int prevIndex(int var0, int var1) {
            return var0 - 1 >= 0 ? var0 - 1 : var1 - 1;
        }

存儲數(shù)據結構 ---Entry 類 繼承WeakReference

        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

Entry 繼承WeakReference 使用弱引用旅挤,可以將ThreadLocal對象的生命周期和線程生命周期解綁 ,持有對ThreadLocal的弱引用峦阁,可以使得ThreadLocal在沒有其他強引用的時候被GC回收掉谦铃,這樣可以避免因為線程得不到摧毀 導致ThreadLocal對象無法被垃圾回收器回收

參考文檔

ThreadLocal源碼分析

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榔昔,隨后出現(xiàn)的幾起案子驹闰,更是在濱河造成了極大的恐慌瘪菌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘹朗,死亡現(xiàn)場離奇詭異师妙,居然都是意外死亡,警方通過查閱死者的電腦和手機屹培,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門默穴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褪秀,你說我怎么就攤上這事蓄诽。” “怎么了媒吗?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵仑氛,是天一觀的道長。 經常有香客問我闸英,道長锯岖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任甫何,我火速辦了婚禮出吹,結果婚禮上,老公的妹妹穿的比我還像新娘辙喂。我一直安慰自己捶牢,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布巍耗。 她就那樣靜靜地躺著叫确,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芍锦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天飞盆,我揣著相機與錄音娄琉,去河邊找鬼。 笑死吓歇,一個胖子當著我的面吹牛孽水,可吹牛的內容都是我干的。 我是一名探鬼主播城看,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼女气,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了测柠?” 一聲冷哼從身側響起炼鞠,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缘滥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谒主,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝扼,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年霎肯,在試婚紗的時候發(fā)現(xiàn)自己被綠了擎颖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡观游,死狀恐怖搂捧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情懂缕,我是刑警寧澤允跑,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站提佣,受9級特大地震影響吮蛹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拌屏,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一潮针、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倚喂,春花似錦每篷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舱权,卻和暖如春矗晃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宴倍。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工张症, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸵贬。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓俗他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阔逼。 傳聞我的和親對象是個殘疾皇子兆衅,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容