『Java并發(fā)編程』ThreadLocal的使用

ThreadLocal是Java并發(fā)編程中的常用類,可以解決多個線程共享變量問題曙旭,這是不同于“synchronized”的解決方法。

ThreadLocal介紹

ThreadLocal在每個線程中維護(hù)一個映射MAP,每個線程都單獨有一個變量的副本喂走,實現(xiàn)線程間變量隔離捺弦。
在并發(fā)編程中饮寞,我們可能會遇到多個線程使用同一變量的情境孝扛。比如T1,T2幽崩,兩個線程疗琉,T1在操作某對象時T2也同時操作該對象,造成數(shù)據(jù)混亂歉铝,結(jié)果與預(yù)期不符盈简。對于這種情況常用做法是對操作對象進(jìn)行同步處理(synchronized),但是同步操作會降低執(zhí)行效率太示。ThreadLocal提供了另一種方式來解決并發(fā)問題柠贤,每個線程都操作同一個變量的副本,不影響其他線程中該變量的值类缤。

ThreadLocal常用方法

ThreadLocal類主要有get()臼勉,set(T value)remove()餐弱,initialValue()幾個方法宴霸,結(jié)構(gòu)簡單清晰。

  • get()方法可以獲得該線程所維護(hù)的Map表膏蚓,如果在之前沒有使用set(T value)方法設(shè)值瓢谢,則會獲得null值,所以建議重寫initialValue()方法驮瞧,自定義默認(rèn)返回值氓扛。
  • set(T value)用來設(shè)置當(dāng)前線程中該ThreadLocal對應(yīng)的值,Key是該ThreadLocal的引用论笔。
  • remove()方法用來擦除線程中當(dāng)前Threadlocal所映射的值采郎。
  • initialValue()是定義默認(rèn)返回值的方法,推薦在使用ThreadLocal時重寫該方法狂魔,自定義默認(rèn)返回值蒜埋。
//創(chuàng)建ThreadLocal時重寫initialValue()方法
public class TestThreadLocal {
    private static final ThreadLocal<String> value = new ThreadLocal<String>() {
        @Override
        protected String initialValue() {
            return "Djz";
        }
    };
}

ThreadLocal總結(jié)

  • 使用ThreadLocal可以在每個線程中保存同一個變量的副本,值相同最楷,但是各線程操作的是自己線程中所保存的副本整份,不會互相影響,不同于同步操作思路解決了多線程并發(fā)問題管嬉。
  • ThreadLocal類將自己的引用作為Key值皂林,存儲對象作為Value,存儲在每個線程所維護(hù)的Map映射表中蚯撩,這樣設(shè)計可以使Map與線程綁定础倍,當(dāng)線程被銷毀后,所維護(hù)的Map映射表也會被銷毀胎挎。
  • 在創(chuàng)建ThreadLocal建議重寫initialValue()方法沟启,因為該方法默認(rèn)返回null值忆家,存在NPE隱患。
  • 由于ThreadLocal提供了線程內(nèi)部的局部變量德迹,因此該變量生命周期與線程相同芽卿,當(dāng)線程銷毀時該局部變量也會銷毀。
  • 因為ThreadLocal是在每個線程中都存儲一個對象的副本胳搞,因此對內(nèi)存的消耗相比不使用ThreadLocal更大卸例。
  • ThreadLocal也解決了變量傳遞問題,在整個線程內(nèi)ThreadLocal所映射的對象全局共享肌毅,降低了編碼時的復(fù)雜度筷转。

文章內(nèi)容為個人理解,如有錯誤歡迎指出悬而。

郵箱:CodingDjz@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呜舒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笨奠,更是在濱河造成了極大的恐慌袭蝗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件般婆,死亡現(xiàn)場離奇詭異到腥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腺兴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門左电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉侧,“玉大人页响,你說我怎么就攤上這事《翁埽” “怎么了闰蚕?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長连舍。 經(jīng)常有香客問我没陡,道長,這世上最難降的妖魔是什么索赏? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任盼玄,我火速辦了婚禮,結(jié)果婚禮上潜腻,老公的妹妹穿的比我還像新娘埃儿。我一直安慰自己,他們只是感情好融涣,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布童番。 她就那樣靜靜地躺著精钮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剃斧。 梳的紋絲不亂的頭發(fā)上轨香,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音幼东,去河邊找鬼臂容。 笑死,一個胖子當(dāng)著我的面吹牛根蟹,可吹牛的內(nèi)容都是我干的策橘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼娜亿,長吁一口氣:“原來是場噩夢啊……” “哼丽已!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起买决,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤沛婴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后督赤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁灯,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年躲舌,在試婚紗的時候發(fā)現(xiàn)自己被綠了丑婿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡没卸,死狀恐怖羹奉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情约计,我是刑警寧澤诀拭,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站煤蚌,受9級特大地震影響耕挨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尉桩,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一筒占、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜘犁,春花似錦翰苫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽农尖。三九已至,卻和暖如春良哲,著一層夾襖步出監(jiān)牢的瞬間盛卡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工筑凫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留滑沧,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓巍实,卻偏偏與公主長得像滓技,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棚潦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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