ThreadLocal原理及內(nèi)存泄露以及最佳實(shí)踐

Thread.currentThread.map當(dāng)前線程的map
map的key是ThreadLocal的實(shí)例
當(dāng)ThreadLocal被回收時(shí),其key為null,但value可能泄露與內(nèi)存所以采用弱引用

ThreadLocal的map的Entry為什么采用弱引用

防止內(nèi)存泄漏,tl本身為null時(shí),無(wú)法及時(shí)回收key為null的value
key 使用弱引用:引用的ThreadLocal的對(duì)象被回收了柱衔,由于ThreadLocalMap持有ThreadLocal的弱引用街佑,即使沒(méi)有手動(dòng)刪除,ThreadLocal也會(huì)被回收盾舌。value在下一次ThreadLocalMap調(diào)用set,get,remove的時(shí)候會(huì)被清除

ThreadLocal用途
聲明式識(shí)事務(wù)

ThreadLocal原理
每個(gè)Thread 維護(hù)一個(gè) ThreadLocalMap 映射表汹押,這個(gè)映射表的 key 是 ThreadLocal實(shí)例本身矿筝,value 是真正需要存儲(chǔ)的 Object
ThreadLocal 本身并不存儲(chǔ)值,它只是作為一個(gè) key 來(lái)讓線程從 ThreadLocalMap 獲取 value
ThreadLocalMap 是使用 ThreadLocal 的弱引用作為 Key 的棚贾,弱引用的對(duì)象在 GC 時(shí)會(huì)被回收

ThreadLocal導(dǎo)致內(nèi)存泄露

ThreadLocalMap的生命周期跟Thread一樣長(zhǎng)

ThreadLocalMap使用ThreadLocal的弱引用作為key窖维,
如果一個(gè)ThreadLocal沒(méi)有外部強(qiáng)引用來(lái)引用它,那么系統(tǒng) GC 的時(shí)候妙痹,
這個(gè)ThreadLocal勢(shì)必會(huì)被回收铸史,這樣一來(lái),ThreadLocalMap中就會(huì)出現(xiàn)key為null的
Entry怯伊,就沒(méi)有辦法訪問(wèn)這些key為null的Entry的value琳轿,如果當(dāng)前線程再遲遲不結(jié)束的話(線程池重用線程),
這些key為null的Entry的value就會(huì)一直存在一條強(qiáng)引用鏈:
Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永遠(yuǎn)無(wú)法回收耿芹,
造成內(nèi)存泄漏崭篡。

ThreadLocal的措施
    get(),set(),remove()的時(shí)候都會(huì)清除線程ThreadLocalMap里所有key為null的value
    但無(wú)法保證 
    
        static的ThreadLocal,延長(zhǎng)了ThreadLocal的生命周期吧秕,可能導(dǎo)致的內(nèi)存泄漏
        分配使用了ThreadLocal又不再調(diào)用get(),set(),remove()方法琉闪,那么就會(huì)導(dǎo)致內(nèi)存泄漏

ThreadLocal最佳實(shí)踐
每次使用完ThreadLocal,都調(diào)用它的remove()方法砸彬,清除數(shù)據(jù)
在使用線程池的情況下颠毙,沒(méi)有及時(shí)清理ThreadLocal,不僅是內(nèi)存泄漏的問(wèn)題砂碉,更嚴(yán)重的是可能導(dǎo)致業(yè)務(wù)邏輯出現(xiàn)問(wèn)題蛀蜜。所以,使用ThreadLocal就跟加鎖完要解鎖一樣增蹭,用完就清理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滴某,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壮池,老刑警劉巖偏瓤,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異椰憋,居然都是意外死亡厅克,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門橙依,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)证舟,“玉大人,你說(shuō)我怎么就攤上這事窗骑∨穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵创译,是天一觀的道長(zhǎng)抵知。 經(jīng)常有香客問(wèn)我,道長(zhǎng)软族,這世上最難降的妖魔是什么刷喜? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮立砸,結(jié)果婚禮上掖疮,老公的妹妹穿的比我還像新娘。我一直安慰自己颗祝,他們只是感情好浊闪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螺戳,像睡著了一般搁宾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倔幼,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天盖腿,我揣著相機(jī)與錄音,去河邊找鬼凤藏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堕伪,可吹牛的內(nèi)容都是我干的揖庄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼欠雌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹄梢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤禁炒,失蹤者是張志新(化名)和其女友劉穎而咆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幕袱,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暴备,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了们豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯捻。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖望迎,靈堂內(nèi)的尸體忽然破棺而出障癌,到底是詐尸還是另有隱情,我是刑警寧澤辩尊,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布涛浙,位于F島的核電站,受9級(jí)特大地震影響摄欲,放射性物質(zhì)發(fā)生泄漏轿亮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一蒿涎、第九天 我趴在偏房一處隱蔽的房頂上張望哀托。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至憔辫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背添坊。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箫锤,地道東北人贬蛙。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谚攒,于是被迫代替她去往敵國(guó)和親阳准。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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