ThreadLocal與WeakReference

ThreadLocal是面試中比較容易碰上的問(wèn)題觅闽,一般會(huì)要求講解它的實(shí)現(xiàn)原理以及存在的問(wèn)題。最近在美團(tuán)的面試中聊到這個(gè)問(wèn)題,雖然去年有看過(guò)并收藏了關(guān)于ThreadLocal的一些文章但目前幾乎忘了干凈(還是實(shí)踐以及理解的不夠沒(méi)有形成記憶 …),所以趁著這個(gè)機(jī)會(huì)好好的總結(jié)記錄一下旋圆。

ThreadLocal的實(shí)現(xiàn)機(jī)制不復(fù)雜,它將自身實(shí)例作為key麸恍,和需要保存的value一起存入到當(dāng)前線程的一個(gè)map當(dāng)中灵巧,代碼可以簡(jiǎn)單的描寫為(當(dāng)然實(shí)際的代碼并不是這樣):

`Thread.currentThread().threadLocals.put(this, value);// threadLocal.set(T)

Thread.currentThread().threadLocals.get(this);// threadLocal.get()`

ThreadLocal實(shí)現(xiàn)中特別值得注意的是1點(diǎn):每個(gè)線程中都保存著一個(gè)threadLocals實(shí)例,該實(shí)例是Map接口的實(shí)現(xiàn) – ThreadLocalMap抹沪。而這個(gè)類實(shí)現(xiàn)的特殊地方在于刻肄,ThreadLocalMap中的Entry中的key類型是WeakReference而非ThreadLocal。為什么ThreadLocalMap中需要使用WeakReference作為key類型融欧,那么首先需要理解WeakReference的意義敏弃。

WeakReference是Java語(yǔ)言規(guī)范中為了區(qū)別直接的對(duì)象引用(程序中通過(guò)構(gòu)造函數(shù)聲明出來(lái)的對(duì)象引用)而定義的另外一種引用關(guān)系。WeakReference標(biāo)志性的特點(diǎn)是:reference實(shí)例不會(huì)影響到被應(yīng)用對(duì)象的GC回收行為(即只要對(duì)象被除WeakReference對(duì)象之外所有的對(duì)象解除引用后噪馏,該對(duì)象便可以被GC回收)麦到,只不過(guò)在被對(duì)象回收之后,reference實(shí)例想獲得被應(yīng)用的對(duì)象時(shí)程序會(huì)返回null欠肾。

理解了WeakReference之后瓶颠,ThreadLocalMap使用它的目的也相對(duì)清晰了:當(dāng)threadLocal實(shí)例可以被GC回收時(shí),系統(tǒng)可以檢測(cè)到該threadLocal對(duì)應(yīng)的Entry是否已經(jīng)過(guò)期(根據(jù)reference.get() == null來(lái)判斷刺桃,如果為true則表示過(guò)期粹淋,程序內(nèi)部稱為stale slots)來(lái)自動(dòng)做一些清除工作,否則如果不清除的話容易產(chǎn)生內(nèi)存無(wú)法釋放的問(wèn)題:value對(duì)應(yīng)的對(duì)象即使不再使用瑟慈,但由于被threadLocalMap所引用導(dǎo)致無(wú)法被GC回收桃移。實(shí)際代碼中,ThreadLocalMap會(huì)在set封豪,get以及resize等方法中對(duì)stale slots做自動(dòng)刪除(set以及get不保證所有過(guò)期slots會(huì)在操作中會(huì)被刪除谴轮,而resize則會(huì)刪除threadLocalMap中所有的過(guò)期slots)。當(dāng)然將threadLocal對(duì)象設(shè)置為null并不能完全避免內(nèi)存泄露對(duì)象吹埠,最安全的辦法仍然是調(diào)用ThreadLocal的remove方法,來(lái)徹底避免可能的內(nèi)存泄露疮装。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缘琅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子廓推,更是在濱河造成了極大的恐慌刷袍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樊展,死亡現(xiàn)場(chǎng)離奇詭異呻纹,居然都是意外死亡堆生,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門雷酪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淑仆,“玉大人,你說(shuō)我怎么就攤上這事哥力≌岬。” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吩跋,是天一觀的道長(zhǎng)寞射。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锌钮,這世上最難降的妖魔是什么桥温? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮梁丘,結(jié)果婚禮上侵浸,老公的妹妹穿的比我還像新娘。我一直安慰自己兰吟,他們只是感情好通惫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著混蔼,像睡著了一般履腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭嚣,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天遵湖,我揣著相機(jī)與錄音,去河邊找鬼晚吞。 笑死延旧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的槽地。 我是一名探鬼主播迁沫,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捌蚊!你這毒婦竟也來(lái)了集畅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缅糟,失蹤者是張志新(化名)和其女友劉穎挺智,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窗宦,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赦颇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年二鳄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒怯。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡订讼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沪摄,到底是詐尸還是另有隱情躯嫉,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布杨拐,位于F島的核電站祈餐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哄陶。R本人自食惡果不足惜帆阳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋吨。 院中可真熱鬧蜒谤,春花似錦、人聲如沸至扰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敢课。三九已至阶祭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間直秆,已是汗流浹背濒募。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圾结,地道東北人瑰剃。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筝野,于是被迫代替她去往敵國(guó)和親晌姚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 前言 ThreadLocal很多同學(xué)都搞不懂是什么東西歇竟,可以用來(lái)干嘛舀凛。但面試時(shí)卻又經(jīng)常問(wèn)到,所以這次我和大家一起學(xué)...
    liangzzz閱讀 12,451評(píng)論 14 228
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 7,635評(píng)論 4 30
  • ThreadLocal途蒋,線程變量,是一個(gè)以ThreadLocal對(duì)象為鍵馋记,任意對(duì)象為值 的存儲(chǔ) 結(jié)構(gòu)号坡。該結(jié)構(gòu)附著于...
    Justlearn閱讀 406評(píng)論 0 2
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理懊烤,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 15,601評(píng)論 3 83
  • 也不知道是何時(shí)開始宽堆,默默出現(xiàn)月經(jīng)綜合癥腌紧。每個(gè)月都會(huì)有那么幾天會(huì)情緒低落,易暴躁畜隶,易發(fā)火壁肋。 從早晨起來(lái)就深深的在糾結(jié)...
    文文的花期閱讀 301評(píng)論 0 1