關(guān)于一些ThreadLocal的認(rèn)識(shí)

ThreadLocal的主要實(shí)現(xiàn)如下:

ThreadLocal中有一個(gè)靜態(tài)內(nèi)部類挎挖,名為ThreadLocalMap,主要定義如下:

     * ThreadLocalMap is a customized hash map suitable only for
     * maintaining thread local values. No operations are exported
     * outside of the ThreadLocal class. The class is package private to
     * allow declaration of fields in class Thread.  To help deal with
     * very large and long-lived usages, the hash table entries use
     * WeakReferences for keys. However, since reference queues are not
     * used, stale entries are guaranteed to be removed only when
     * the table starts running out of space.
     */
    static class ThreadLocalMap {

        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

注意看其中的說(shuō)明:

  • ThreadLocalMap是個(gè)定制的HashMap荞雏,所以很多HashMap的實(shí)現(xiàn)段标,這里其實(shí)都有類似的東西白粉。
  • ThreadLocalMap的Entrty元素昔穴,注意是WeakReference類型暖侨,想想weakReference的特點(diǎn)嘞冬念,它跟SoftReference的區(qū)別就是:
    • SoftReference指向的對(duì)象趁窃,只有在內(nèi)存不足時(shí)才會(huì)被GC回收掉。
    • 只有WeakReference指向的對(duì)象急前,在下次GC的時(shí)候一般就會(huì)回收掉醒陆。
      所以這個(gè)Entry繼承WeakReference,應(yīng)該只是為了當(dāng)一個(gè)線程結(jié)束時(shí)裆针,其對(duì)應(yīng)的ThreadLocal數(shù)據(jù)會(huì)盡快的被釋放掉刨摩。
  • Entry中的key值是ThreadLocal本身,value則是你需要存儲(chǔ)的數(shù)據(jù)(Object類型)世吨,所以對(duì)應(yīng)到HashMap澡刹,可以想到其hashcode就是key的hashcode。
  • 每個(gè)線程獨(dú)享一個(gè)ThreadLocalMap耘婚,比如一個(gè)Thread的實(shí)現(xiàn)罢浇,里面定義了4個(gè)ThreadLocal,那么在實(shí)際代碼運(yùn)行過(guò)程中边篮,只會(huì)有一個(gè)ThreadLocalMap實(shí)例己莺,里面包含了至少4個(gè)Entry奏甫,分別對(duì)應(yīng)上述的幾個(gè)ThreadLocal對(duì)象。而多個(gè)Thread之間凌受,ThreadLocalMap是不共用的阵子,每個(gè)線程對(duì)象自己維護(hù)自己的ThreadLocalMap。
  • 關(guān)于ThreadLocalMap存放在哪兒胜蛉,其實(shí)跟正常的java對(duì)象一樣挠进,都是存放在堆空間里,通過(guò)線程來(lái)獲取誊册,如下:
class Thread implements Runnable {
    /* Make sure registerNatives is the first thing <clinit> does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

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

  ...

通過(guò)線程對(duì)象 t.threadLocals就可以獲取到整個(gè)ThreadLocalMap领突,然后再根據(jù)key值獲取存入的結(jié)果。

  • 這里之前看的時(shí)候案怯,沒(méi)有仔細(xì)去看對(duì)應(yīng)的實(shí)現(xiàn)君旦,以為是放在線程在初始化的時(shí)候指定的-Xss分配的堆空間內(nèi),但是仔細(xì)看過(guò)代碼之后嘲碱,發(fā)現(xiàn)兩者并無(wú)關(guān)聯(lián)金砍。這里還是理解不夠深,-Xss指定的是Stack space麦锯,也就是椝〕恚空間,其中是不會(huì)存放對(duì)象的扶欣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹅巍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子料祠,更是在濱河造成了極大的恐慌骆捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术陶,死亡現(xiàn)場(chǎng)離奇詭異凑懂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梧宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門接谨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人塘匣,你說(shuō)我怎么就攤上這事脓豪。” “怎么了忌卤?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵扫夜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笤闯,這世上最難降的妖魔是什么堕阔? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮颗味,結(jié)果婚禮上超陆,老公的妹妹穿的比我還像新娘。我一直安慰自己浦马,他們只是感情好时呀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晶默,像睡著了一般谨娜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磺陡,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天趴梢,我揣著相機(jī)與錄音,去河邊找鬼仅政。 笑死垢油,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圆丹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼躯喇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辫封!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起廉丽,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倦微,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后正压,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣福,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年焦履,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拓劝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘉裤,死狀恐怖郑临,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屑宠,我是刑警寧澤厢洞,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響躺翻,放射性物質(zhì)發(fā)生泄漏丧叽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一公你、第九天 我趴在偏房一處隱蔽的房頂上張望踊淳。 院中可真熱鬧,春花似錦省店、人聲如沸嚣崭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雹舀。三九已至,卻和暖如春粗俱,著一層夾襖步出監(jiān)牢的瞬間说榆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工寸认, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留签财,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓偏塞,卻偏偏與公主長(zhǎng)得像唱蒸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灸叼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 前言 ThreadLocal很多同學(xué)都搞不懂是什么東西神汹,可以用來(lái)干嘛。但面試時(shí)卻又經(jīng)常問(wèn)到古今,所以這次我和大家一起學(xué)...
    liangzzz閱讀 12,466評(píng)論 14 228
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 7,645評(píng)論 4 30
  • 原創(chuàng)文章&經(jīng)驗(yàn)總結(jié)&從校招到A廠一路陽(yáng)光一路滄桑 詳情請(qǐng)戳www.codercc.com 1. ThreadLoc...
    你聽(tīng)___閱讀 6,742評(píng)論 8 19
  • ThreadLocal屁魏,線程變量,是一個(gè)以ThreadLocal對(duì)象為鍵捉腥,任意對(duì)象為值 的存儲(chǔ) 結(jié)構(gòu)氓拼。該結(jié)構(gòu)附著于...
    Justlearn閱讀 410評(píng)論 0 2
  • 我是一名河南鄭州裝修公司的項(xiàng)目負(fù)責(zé)人,30歲抵碟,男桃漾,2013年10月28號(hào)回的鄭州,至今有3年多立磁。已婚呈队,生育一女。 ...
    馬夢(mèng)小璐閱讀 164評(píng)論 0 0