ThreadLocal

ThreadLocal是一個(gè)關(guān)于創(chuàng)建線程局部變量的類。使用ThreadLocal創(chuàng)建的變量是線程隔離的,其他線程則無法訪問和修改。開發(fā)過程中利用ThreadLocal可以比較方便的實(shí)現(xiàn)線程級(jí)別的局部變量,典型應(yīng)用:Spring MVC中的HttpServletRequest、SecurityContextHolder等。之前對(duì)于ThreadLocal只是知其然不知其所以然,本著求是的態(tài)度對(duì)ThreadLocal源碼做了進(jìn)一步的解析。主要有幾個(gè)部分:簡(jiǎn)單應(yīng)用實(shí)例,關(guān)鍵名詞及其關(guān)系,關(guān)鍵方法及其主要流程。

下面通過一個(gè)實(shí)例直觀感受下ThreadLocal實(shí)現(xiàn)的變量的線程隔離:


多個(gè)線程共享threadLocal變量


線程隔離

ThreadLocal、Thread以及ThreadLocalMap

三個(gè)ThreadLocal相關(guān)的關(guān)鍵名詞的相互關(guān)系為:每一個(gè)Thread中都有一個(gè)ThreadLocalMap存儲(chǔ)線程級(jí)別變量,ThreadLocalMap的key為定義的同一個(gè)ThreadLocal變量。ThreadLocal雖然只有一個(gè)并且在Thread之間貢獻(xiàn)但是卻可以從不同的Thread中取出不同的值的秘訣就在于此:key雖然是同一個(gè)但是Map卻不相同。

ThreadLocal方法主要是set,get,remove以及initial,

? ? set:首先從Thread中拿到ThreadLocalMap,判斷ThreadLocalMap是否為空如果不為空以當(dāng)前ThreadLocal作為Key存入ThreadLocal,如果為空創(chuàng)建map然后存儲(chǔ)value。

set

get,remove也是一樣,先從當(dāng)前線程拿到相應(yīng)map再做相關(guān)操作。

getMap:實(shí)現(xiàn)真的超級(jí)簡(jiǎn)單:


getMap

另外ThreadLocal還提供了一些諸如createInheritedMap、withInitial等相關(guān)方便操作的方法。有興趣的同學(xué)可以研究。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 下面我就以面試問答的形式學(xué)習(xí)我們的——ThreadLocal類(源碼分析基于JDK8) 問答內(nèi)容 1、問:Thre...
    Sophia_dd35閱讀 2,150評(píng)論 1 36
  • 移步Android Handler機(jī)制詳解[http://www.itdecent.cn/p/e37e2db2b...
    凱玲之戀閱讀 942評(píng)論 0 0
  • 以下內(nèi)容轉(zhuǎn)載自:ThreadLocal 深度解析最近想學(xué)習(xí)ThreadLocal原理方面知識(shí),通過多篇博客對(duì)比學(xué)習(xí)...
    逆水尋洲閱讀 790評(píng)論 0 2
  • 一.對(duì)ThreadLocal的理解二.深入解析ThreadLocal類三.ThreadLocal的應(yīng)用場(chǎng)景 對(duì)Th...
    CoderZS閱讀 478評(píng)論 0 1
  • 爸:床前明月光 娃:疑是地上霜 爸:抬頭思故鄉(xiāng) 娃:舉頭~ 娃:媽媽,我做了一個(gè)夢(mèng)。我夢(mèng)到美人魚了。 我:為什么呢...
    zjj朱閱讀 175評(píng)論 0 0

友情鏈接更多精彩內(nèi)容