ThreadLocal 雜談

ThreadLocal 是為多線程服務(wù)的业筏。本質(zhì)上ThreadLocal是一個關(guān)于創(chuàng)建線程局部變量的類纤怒。
通常情況下,我們創(chuàng)建的變量是可以被任何一個線程訪問并修改的截歉。而使用ThreadLocal創(chuàng)建的變量只能被當(dāng)前線程訪問而咆,其他線程則無法訪問和修改霍比。舉個例子, 服務(wù)器同時被100個用戶訪問暴备,訪問的時候需要對用戶信息進行操作悠瞬,這里threadLocal就可以用來對這100個用戶信息進行thread級別的隔離。

ThreadLocal是如何做到變量只能被當(dāng)前線程訪問呢?

首先需要聲明的是thread local是通過給thread創(chuàng)建變量副本的方式來存儲變量的浅妆。這些需要被線程使用到的變量就是存儲在thread對象的threadLocals屬性上望迎。

這里又要提到ThreadLocalMap,這個是threadlocals的類型凌外。從這個角度來看ThreadLocal類更像是一個util類辩尊,主要的職責(zé)就是幫助thread管理threadLocals屬性。

變量存儲

利用threadlocal對象 set 變量到thread上時調(diào)用的set方法源碼是通過獲取當(dāng)前thread上綁定的threadlocals屬性的值來進行操作康辑,最終所有的值真正存儲的位置其實都在thread本身與threadlocal對象并無直接關(guān)系摄欲。

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

再來看get方法:

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();
}

這里的設(shè)計就有點意思了,首先先從thread上拿到了threadlocals屬性疮薇,這是一個ThreadLocalMap類型的值胸墙,也是數(shù)據(jù)真實的存儲位置。thread所關(guān)聯(lián)的所有threadlocal其實都存在這個map的entry里按咒,也就是說不管這個thread里持有了多少個threadlocal實例迟隅,變量副本存儲的地方有且只有一個map的entry。

每個Thread 維護一個 ThreadLocalMap 映射表励七,這個映射表的 key 是 ThreadLocal 實例本身智袭,value 是真正需要存儲的 Object。
也就是說 ThreadLocal 本身并不存儲值掠抬,它只是作為一個 key 來讓線程從 ThreadLocalMap 獲取 value吼野。值得注意的是圖中的虛線,表示 ThreadLocalMap 是使用 ThreadLocal 的弱引用作為 Key 的剿另,弱引用的對象在 GC 時會被回收箫锤。

threadlocal的存在是為了幫助thread進行threadlocals屬性的關(guān)于制定key(threadllocal其實就是threadlocalMap的key)的賦值和取值。多線程之間的threadlocal實例本身其實是共享的,所以使用的時候一般定義成static變量雨女,達到thread間共享實例的目的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阳准,一起剝皮案震驚了整個濱河市氛堕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌野蝇,老刑警劉巖讼稚,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绕沈,居然都是意外死亡锐想,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門乍狐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赠摇,“玉大人,你說我怎么就攤上這事∨褐模” “怎么了烫罩?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洽故。 經(jīng)常有香客問我贝攒,道長,這世上最難降的妖魔是什么时甚? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任隘弊,我火速辦了婚禮,結(jié)果婚禮上荒适,老公的妹妹穿的比我還像新娘长捧。我一直安慰自己,他們只是感情好吻贿,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布串结。 她就那樣靜靜地躺著,像睡著了一般舅列。 火紅的嫁衣襯著肌膚如雪肌割。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天帐要,我揣著相機與錄音把敞,去河邊找鬼。 笑死榨惠,一個胖子當(dāng)著我的面吹牛奋早,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赠橙,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耽装,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了期揪?” 一聲冷哼從身側(cè)響起掉奄,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凤薛,沒想到半個月后姓建,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡缤苫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年速兔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活玲。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涣狗,死狀恐怖谍婉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屑柔,我是刑警寧澤屡萤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站掸宛,受9級特大地震影響死陆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唧瘾,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一措译、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饰序,春花似錦领虹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝠嘉,卻和暖如春最疆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚤告。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工努酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杜恰。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓获诈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親心褐。 傳聞我的和親對象是個殘疾皇子舔涎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 7,634評論 4 30
  • 前言 ThreadLocal很多同學(xué)都搞不懂是什么東西,可以用來干嘛檬寂。但面試時卻又經(jīng)常問到终抽,所以這次我和大家一起學(xué)...
    liangzzz閱讀 12,445評論 14 228
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司桶至,掛了不少,但最終還是拿到小米匾旭、百度镣屹、阿里、京東价涝、新浪女蜈、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,241評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)伪窖,斷路器逸寓,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 樂讀網(wǎng)是一個什么性質(zhì)的網(wǎng)站竹伸?百度百科的介紹是這樣的: 我不知道這樣一個“在文摘類網(wǎng)站中占有舉足輕重地位”的閱讀平臺...
    文可清心也閱讀 916評論 0 2