ThreadLocal詳解

ThreadLocal是用來存儲每一個線程的數據的法希,使用set和get來讀寫數據。

ThreadLocal<Object> local = new ThreadLocal<>();
local.set(6);
System.out.println(local.get());

ThreadLocal是用來維護ThreadLocalMap的忙厌。set和get操作都是對ThreadLocalMap操作。


set方法

get方法

每一個Thread都有一個單獨的ThreadLocalMap娶视。



ThreadLocalMap定義是在Thread里面隘蝎,使用是在threadlocal里面购啄。
ThreadLocalMap其實是一個默認大小16的數組,一個線程的每一個ThreadLocal占用一個位置末贾,這是通過ThreadLocalMap里面的threadLocalHashCode對數組長度取模實現的闸溃。


ThreadLocal內存溢出

存儲數據的Entry的key的ThreadLocal采用的弱引用,能被清理掉拱撵,但是value是強引用辉川,引用關系為:Thread -> ThreadLocalMap -> Entry -> Value,只要該線程不死拴测,那么這個強引用就一直存在乓旗,不會被清理掉,導致內存溢出集索。


image.png

解決方法為:

雖然ThreadLocal的作者想到了這點屿愚,也做了些優(yōu)化,例如在get的時候當發(fā)現key是null的時候务荆,會遍歷一次整個Entry數組妆距,remove掉key為null的entry,把value指向null函匕,消除這條強引用鏈娱据。源碼方法為expungeStaleEntry。
所以開發(fā)者要養(yǎng)成良好的習慣盅惜,記得用完ThreadLocal時中剩,調一次ThreadLocal.remove()方法或者ThreadLocal.set(null)

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抒寂,隨后出現的幾起案子结啼,更是在濱河造成了極大的恐慌,老刑警劉巖屈芜,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊愧,死亡現場離奇詭異,居然都是意外死亡井佑,警方通過查閱死者的電腦和手機糕珊,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅糟,“玉大人,你說我怎么就攤上這事澜公∧妨恚” “怎么了喇肋?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迹辐。 經常有香客問我蝶防,道長,這世上最難降的妖魔是什么明吩? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任间学,我火速辦了婚禮,結果婚禮上印荔,老公的妹妹穿的比我還像新娘低葫。我一直安慰自己,他們只是感情好仍律,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布嘿悬。 她就那樣靜靜地躺著,像睡著了一般水泉。 火紅的嫁衣襯著肌膚如雪善涨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天草则,我揣著相機與錄音钢拧,去河邊找鬼。 笑死炕横,一個胖子當著我的面吹牛源内,可吹牛的內容都是我干的。 我是一名探鬼主播看锉,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼姿锭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伯铣?” 一聲冷哼從身側響起呻此,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腔寡,沒想到半個月后焚鲜,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡放前,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年忿磅,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凭语。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡葱她,死狀恐怖,靈堂內的尸體忽然破棺而出似扔,到底是詐尸還是另有隱情吨些,我是刑警寧澤搓谆,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站豪墅,受9級特大地震影響泉手,放射性物質發(fā)生泄漏。R本人自食惡果不足惜偶器,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一斩萌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屏轰,春花似錦颊郎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叨粘,卻和暖如春猾编,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背升敲。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工答倡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驴党。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓瘪撇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親港庄。 傳聞我的和親對象是個殘疾皇子倔既,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 介紹 顧名思義這個類提供線程局部變量每個線程(通過其get或set方法)都有自己獨立初始化的變量副本 Thread...
    Ray昱成閱讀 241評論 0 0
  • ThreadLocal是一個關于創(chuàng)建線程局部變量的類。 通常情況下鹏氧,我們創(chuàng)建的變量是可以被任何一個線程訪問并修改的...
    icecrea閱讀 719評論 0 2
  • 1 ThreadLocal簡介 多線程訪問同一個共享變量的時候容易出現并發(fā)問題渤涌,特別是多個線程對一個變量進行寫入的...
    愛健身的兔子閱讀 437評論 0 0
  • ThreadLocal是什么? ThreadLocal是一個關于創(chuàng)建線程局部變量的類把还。 通常情況下实蓬,我們創(chuàng)建的變量...
    chenjieping1995閱讀 2,239評論 1 3
  • 引言 ThreadLocal的官方API解釋為:“該類提供了線程局部 (thread-local) 變量。這些變量...
    小波同學閱讀 369評論 0 3