ThreadLocal

ThreadLocal 是什么问拘?
是一個關(guān)于創(chuàng)建線程局部變量的類。

每個線程都有一個保存值的 ThreadLocalMap 對象,ThreadLocal 的值就存放在了當(dāng)前線程的 ThreadLocalMap 成員變量中赢笨,所以只能在本線程訪問蛮寂,其他線程不能訪問蔽午。

public class Thread implements Runnable {
  ...

    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;
 ...
}

從當(dāng)前線程的ThreadLocalMap中取出當(dāng)前線程對應(yīng)的變量的副本【注意,變量是保存在線程中的酬蹋,而不是保存在ThreadLocal變量中】

363274-20191206104956269-1729288815.png

ThreadLocalMap維護了Entry環(huán)形數(shù)組及老,數(shù)組中元素Entry的邏輯上的key為某個ThreadLocal對象(實際上是指向該ThreadLocal對象的弱引用),value為代碼中該線程往該ThreadLoacl變量實際塞入的值范抓。

從ThreadLocal讀一個值可能遇到的情況:根據(jù)入?yún)hreadLocal的threadLocalHashCode對表容量取模得到 index

  • 如果index對應(yīng)的slot就是要讀的threadLocal骄恶,則直接返回結(jié)果
  • 調(diào)用getEntryAfterMiss線性探測,過程中每碰到無效slot匕垫,調(diào)用- expungeStaleEntry進行段清理僧鲁;如果找到了key,則返回結(jié)果entry
  • 沒有找到key象泵,返回null

ThreadLocal的set方法可能會有的情況寞秃。

  • 探測過程中slot都不無效,并且順利找到key所在的slot偶惠,直接替換即可
  • 探測過程中發(fā)現(xiàn)有無效slot春寿,調(diào)用replaceStaleEntry,效果是最終一定會把key和value放在這個slot忽孽,并且會盡可能清理無效slot
    -- 在replaceStaleEntry過程中堂淡,如果找到了key,則做一個swap把它放到那個無效slot中扒腕,value置為新值
    -- 在replaceStaleEntry過程中绢淀,沒有找到key,直接在無效slot原地放entry
  • 探測沒有發(fā)現(xiàn)key瘾腰,則在連續(xù)段末尾的后一個空位置放上entry皆的,這也是線性探測法的一部分。放完后蹋盆,做一次啟發(fā)式清理费薄,如果沒清理出去key硝全,并且當(dāng)前table大小已經(jīng)超過閾值了,則做一次rehash楞抡,rehash函數(shù)會調(diào)用一次全量清理slot方法也即expungeStaleEntries伟众,如果完了之后table大小超過了threshold – threshold / 4,則進行擴容2倍

ThreadLocal內(nèi)存泄漏問題召廷?
每個thread中都存在一個map, map的類型是ThreadLocal.ThreadLocalMap. Map中的key為一個threadlocal實例. 這個Map的確使用了弱引用,不過弱引用只是針對key. 每個key都弱引用指向threadlocal. 當(dāng)把threadlocal實例置為null以后,沒有任何強引用指向threadlocal實例,所以threadlocal將會被gc回收. 但是,我們的value卻不能回收,因為存在一條從current thread連接過來的強引用. 只有當(dāng)前thread結(jié)束以后, current thread就不會存在棧中,強引用斷開, Current Thread, Map, value將全部被GC回收凳厢。所以得出一個結(jié)論就是只要這個線程對象被gc回收,就不會出現(xiàn)內(nèi)存泄露竞慢,但在threadLocal設(shè)為null和線程結(jié)束這段時間不會被回收的先紫,就發(fā)生了我們認為的內(nèi)存泄露。其實這是一個對概念理解的不一致筹煮,也沒什么好爭論的遮精。最要命的是線程對象不被回收的情況,這就發(fā)生了真正意義上的內(nèi)存泄露败潦。比如使用線程池的時候本冲,線程結(jié)束是不會銷毀的,會再次使用的就可能出現(xiàn)內(nèi)存泄露 劫扒。(在web應(yīng)用中檬洞,每次http請求都是一個線程,tomcat容器配置使用線程池時會出現(xiàn)內(nèi)存泄漏問題)

https://www.cnblogs.com/mingfeng002/p/11917883.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粟关,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子环戈,更是在濱河造成了極大的恐慌闷板,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院塞,死亡現(xiàn)場離奇詭異遮晚,居然都是意外死亡,警方通過查閱死者的電腦和手機拦止,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門县遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汹族,你說我怎么就攤上這事萧求。” “怎么了顶瞒?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵夸政,是天一觀的道長。 經(jīng)常有香客問我榴徐,道長守问,這世上最難降的妖魔是什么匀归? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮耗帕,結(jié)果婚禮上穆端,老公的妹妹穿的比我還像新娘。我一直安慰自己仿便,他們只是感情好体啰,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著探越,像睡著了一般狡赐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钦幔,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天枕屉,我揣著相機與錄音,去河邊找鬼鲤氢。 笑死搀擂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卷玉。 我是一名探鬼主播哨颂,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼相种!你這毒婦竟也來了威恼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寝并,失蹤者是張志新(化名)和其女友劉穎箫措,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衬潦,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡斤蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镀岛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦牡。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漂羊,靈堂內(nèi)的尸體忽然破棺而出驾锰,到底是詐尸還是另有隱情,我是刑警寧澤走越,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布稻据,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捻悯。R本人自食惡果不足惜匆赃,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望今缚。 院中可真熱鬧算柳,春花似錦、人聲如沸姓言。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何荚。三九已至囱淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間餐塘,已是汗流浹背妥衣。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戒傻,地道東北人税手。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像需纳,于是被迫代替她去往敵國和親芦倒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348