ThreadLocal分析

1. threadlocal簡單介紹

threadlocal:線程私有變量,用于存儲線程隔離的數(shù)據(jù)梁钾,目前我們會用來存儲用戶登錄信息。


threadlocal存儲用戶信息

2. threadlocal常用函數(shù)

threadlocal常用函數(shù)有四個咆槽,分別是:

  • set 存放信息
  • get 提取信息
  • remove 清空threadlocal的數(shù)據(jù)
  • withInitial 初始化get的數(shù)據(jù)陈轿,如果沒初始化圈纺,那么在set之前get到的的值是null

3. ThreadLocalMap介紹

threadlocal存儲數(shù)據(jù)的地方是ThreadLocalMap∏胤蓿現(xiàn)在我們先來看看ThreadLocalMap麦射。

1.ThreadLocalMap類在哪里
ThreadLocalMap是ThreadLocal的內部類
2.ThreadLocalMap類的屬性、Entity類灯谣、構造函數(shù)潜秋、getset方法、有趣的replaceStaleEntry和rehash方法

ThreadLocalMap類的屬性

ThreadLocalMap的屬性

  • INITIAL_CAPACITY 數(shù)組長度 & 存儲數(shù)據(jù)的最大值 ;INITIAL_CAPACITY=Entry[]數(shù)組的長度
  • Entry[] 數(shù)組胎许,存放ThreadLocal.set的值.結合INITIAL_CAPACITY來看峻呛,一個線程可以創(chuàng)建多個ThreadLocal來存放數(shù)據(jù)。(我以前的就是創(chuàng)建一個ThreadLocal辜窑,但又要存放多個數(shù)據(jù)钩述;結果只能在ThreadLocal存放Map,然后...最終就會浪費資源了穆碎,所以最優(yōu)的解決方案是一個ThreadLocal存放一個值牙勘,一個線程存放多個ThreadLocal)例子如下:
public class CacheUser{
  
private static ThreadLocal<User> threadLocalUser = new ThreadLocal<User>();
private static ThreadLocal<Group> threadLocalGroup = new ThreadLocal<Group>();

public Group getGroup(){
  return threadLocalGroup.get();
}

public User getUser(){
  return threadLocalUser.get();
}
}
  • size 線程創(chuàng)建ThreadLocal的數(shù)量,例如上面代碼所禀,那么size=2方面;size也表示存放的多小個值,跟INITIAL_CAPACITY是有區(qū)別的色徘,size<= INITIAL_CAPACITY

  • threshold 閾值恭金;其實很多地方都會存在閾值這東西,超過閾值就擴容褂策,想ThreadLocal的閾值=INITIAL_CAPACITY的三分之二横腿,這個我們可以通過構造函數(shù)能觀察(擴容的時候會從新刷新threshold的值)


    設置threshold

    threshold長度為INITIAL_CAPACITY的三分之二

Entry類
Entry可以簡單理解成存放了key和value兩個值的對象

Entry類截圖

構造函數(shù)
看完上面的可以來看下ThreadLocalMap的構造函數(shù)了。

ThreadLocalMap的構造函數(shù)

說明如下:

  • 首先初始化數(shù)組長度為16
  • firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1); 快速計算出Entry存放數(shù)組的下標斤寂,&是位運算符,為什么要INITIAL_CAPACITY - 1呢蔑水?因為數(shù)組坐標從0開始。另外這里只是快速計算出下標扬蕊,因為是第一次存儲搀别,所以就直接使用計算出來的i值做下標,但第二次的時候尾抑,除了要計算這個下標外歇父,還會判斷這個下標是否已經有值了,有值的話就往后移一位再愈,循環(huán)判斷....這就不扯遠了榜苫,后面講set的時候詳細說
  • setThreshold 設置閾值,其實很多地方都有閾值這個概念翎冲。超過閾值就擴容而不是等把數(shù)組填滿后擴容

set方法
上源碼:

ThreadLocalMap.set源碼截圖

  • 第一步快速計算下標值
  • 第二步循環(huán)判斷數(shù)組的坑位是否有值垂睬,有值往后移一位,最后一位的下一位就是0位,再循環(huán)
nextIndex代碼
  • 第三步 把Entry放入數(shù)組
  • 然后來聊聊截圖兩處地方
image.png
  • 第一處地方為什么k 會等于null驹饺;這讓我百思不得其解钳枕,百度說因為ThreadLocal是弱引用,會被gc回收赏壹,所以會為空鱼炒。這也是解析了Threadlocal會導致內存溢出的問題,也許因為這個才有remove(當不需要ThreadLocal的時候蝌借,清空ThreadLocal的內容)
remove方法截圖
  • 第二處是擴容
擴容邏輯
  • ThreadLocalMap好幾處地方都存在判斷key是否為空昔瞧,空則清除(防止內存溢出)這樣的操作。
  • 其實這里我有個疑問菩佑!為什么要用弱引用自晰,不用強應用來實現(xiàn)呢?

4. inheritableThreadLocals

inheritableThreadLocals實現(xiàn)子線程從父線程繼承值稍坯。使用如下


inheritableThreadLocals用法

5.threadlocal的set和get

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缀磕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劣光,更是在濱河造成了極大的恐慌袜蚕,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绢涡,死亡現(xiàn)場離奇詭異牲剃,居然都是意外死亡,警方通過查閱死者的電腦和手機雄可,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門凿傅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人数苫,你說我怎么就攤上這事聪舒。” “怎么了虐急?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵箱残,是天一觀的道長。 經常有香客問我止吁,道長被辑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任敬惦,我火速辦了婚禮盼理,結果婚禮上,老公的妹妹穿的比我還像新娘俄删。我一直安慰自己宏怔,他們只是感情好奏路,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臊诊,像睡著了一般鸽粉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妨猩,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天潜叛,我揣著相機與錄音秽褒,去河邊找鬼壶硅。 笑死,一個胖子當著我的面吹牛销斟,可吹牛的內容都是我干的庐椒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蚂踊,長吁一口氣:“原來是場噩夢啊……” “哼约谈!你這毒婦竟也來了?” 一聲冷哼從身側響起犁钟,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤棱诱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涝动,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迈勋,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年醋粟,在試婚紗的時候發(fā)現(xiàn)自己被綠了靡菇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡米愿,死狀恐怖厦凤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情育苟,我是刑警寧澤较鼓,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站违柏,受9級特大地震影響笨腥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜勇垛,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一脖母、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闲孤,春花似錦谆级、人聲如沸烤礁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚仔。三九已至,卻和暖如春舆绎,著一層夾襖步出監(jiān)牢的瞬間鲤脏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工吕朵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猎醇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓努溃,卻偏偏與公主長得像硫嘶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梧税,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容