ThreadLocal

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

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


多個線程共享threadLocal變量


線程隔離

ThreadLocal、Thread以及ThreadLocalMap

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

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

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

set

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

getMap:實現(xiàn)真的超級簡單:


getMap

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

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

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

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

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