ThreadLocal so simple

一、什么是ThreadLocal

截圖來(lái)自JDK1.7

本人英文能力有限侧纯,翻譯不對(duì)骚揍,望勿噴

ThreadLocal提供了線程的局部變量媳拴,每個(gè)線程都可以通過(guò)set()和get()來(lái)對(duì)這個(gè)局部變量進(jìn)行操作依鸥,但不會(huì)和其他線程的局部變量進(jìn)行沖突亥至,實(shí)現(xiàn)了線程的數(shù)據(jù)隔離~。

簡(jiǎn)要言之:往ThreadLocal中填充的變量屬于當(dāng)前線程贱迟,該變量對(duì)其他線程而言是隔離的抬闯。

二、為什么要學(xué)習(xí)ThreadLocal关筒?

2.1管理Connection

最典型的是管理數(shù)據(jù)庫(kù)的Connection:當(dāng)時(shí)在學(xué)JDBC的時(shí)候,為了方便操作寫(xiě)了一個(gè)簡(jiǎn)單數(shù)據(jù)庫(kù)連接池杯缺,需要數(shù)據(jù)庫(kù)連接池的理由也很簡(jiǎn)單蒸播,頻繁創(chuàng)建和關(guān)閉Connection是一件非常耗費(fèi)資源的操作,因此需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)連接池~

那么萍肆,數(shù)據(jù)庫(kù)連接池的連接怎么管理呢袍榆??我們交由ThreadLocal來(lái)進(jìn)行管理塘揣。為什么交給它來(lái)管理呢包雀??ThreadLocal能夠?qū)崿F(xiàn)當(dāng)前線程的操作都是用同一個(gè)Connection亲铡,保證了事務(wù)才写!

2.2避免一些參數(shù)傳遞

而如果用了ThreadLocal的話,ThreadLocal就相當(dāng)于一個(gè)機(jī)構(gòu)奖蔓,ThreadLocal機(jī)構(gòu)做了記錄你有那么多張證件赞草。用到的時(shí)候就不用自己掏了,問(wèn)機(jī)構(gòu)拿就可以了吆鹤。

在咨詢(xún)時(shí)的時(shí)候就告訴機(jī)構(gòu):來(lái)厨疙,把我的身份證、房產(chǎn)證疑务、學(xué)生證通通給他沾凄。在辦理時(shí)又告訴機(jī)構(gòu):來(lái)梗醇,把我的身份證、房產(chǎn)證撒蟀、學(xué)生證通通給他

三叙谨、ThreadLocal實(shí)現(xiàn)的原理

首先,我們來(lái)看一下ThreadLocal的set()方法牙肝,因?yàn)槲覀円话闶褂枚际莕ew完對(duì)象唉俗,就往里邊set對(duì)象了

上面有個(gè)ThreadLocalMap,我們?nèi)タ纯催@是什么配椭?


通過(guò)上面我們可以發(fā)現(xiàn)的是ThreadLocalMap是ThreadLocal的一個(gè)內(nèi)部類(lèi)虫溜。用Entry類(lèi)來(lái)進(jìn)行存儲(chǔ)

我們的值都是存儲(chǔ)到這個(gè)Map上的,key是當(dāng)前ThreadLocal對(duì)象股缸!

如果該Map不存在衡楞,則初始化一個(gè):


每個(gè)Thread維護(hù)著一個(gè)ThreadLocalMap的引用

ThreadLocalMap是ThreadLocal的內(nèi)部類(lèi),用Entry來(lái)進(jìn)行存儲(chǔ)

調(diào)用ThreadLocal的set()方法時(shí)敦姻,實(shí)際上就是往ThreadLocalMap設(shè)置值瘾境,key是ThreadLocal對(duì)象,值是傳遞進(jìn)來(lái)的對(duì)象

調(diào)用ThreadLocal的get()方法時(shí)镰惦,實(shí)際上就是往ThreadLocalMap獲取值迷守,key是ThreadLocal對(duì)象

ThreadLocal本身并不存儲(chǔ)值,它只是作為一個(gè)key來(lái)讓線程從ThreadLocalMap獲取value旺入。

正因?yàn)檫@個(gè)原理兑凿,所以ThreadLocal能夠?qū)崿F(xiàn)“數(shù)據(jù)隔離”,獲取當(dāng)前線程的局部變量值茵瘾,不受其他線程影響~


四礼华、避免內(nèi)存泄露

ThreadLocal內(nèi)存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一樣長(zhǎng),如果沒(méi)有手動(dòng)刪除對(duì)應(yīng)key就會(huì)導(dǎo)致內(nèi)存泄漏拗秘,而不是因?yàn)槿跻谩?/p>

想要避免內(nèi)存泄露就要手動(dòng)remove()掉圣絮!

五、應(yīng)用場(chǎng)景

還記得Hibernate的session獲取場(chǎng)景嗎雕旨?


為什么扮匠?每個(gè)線程訪問(wèn)數(shù)據(jù)庫(kù)都應(yīng)當(dāng)是一個(gè)獨(dú)立的Session會(huì)話,如果多個(gè)線程共享同一個(gè)Session會(huì)話凡涩,有可能其他線程關(guān)閉連接了餐禁,當(dāng)前線程再執(zhí)行提交時(shí)就會(huì)出現(xiàn)會(huì)話已關(guān)閉的異常,導(dǎo)致系統(tǒng)異常突照。此方式能避免線程爭(zhēng)搶Session帮非,提高并發(fā)下的安全性。

使用ThreadLocal的典型場(chǎng)景正如上面的數(shù)據(jù)庫(kù)連接管理,線程會(huì)話管理等場(chǎng)景末盔,只適用于獨(dú)立變量副本的情況筑舅,如果變量為全局共享的,則不適用在高并發(fā)下使用陨舱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翠拣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子游盲,更是在濱河造成了極大的恐慌误墓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件益缎,死亡現(xiàn)場(chǎng)離奇詭異谜慌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)莺奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)欣范,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人令哟,你說(shuō)我怎么就攤上這事恼琼。” “怎么了屏富?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵晴竞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狠半,道長(zhǎng)颓鲜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任典予,我火速辦了婚禮,結(jié)果婚禮上乐严,老公的妹妹穿的比我還像新娘瘤袖。我一直安慰自己,他們只是感情好昂验,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布捂敌。 她就那樣靜靜地躺著,像睡著了一般既琴。 火紅的嫁衣襯著肌膚如雪占婉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天甫恩,我揣著相機(jī)與錄音逆济,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奖慌,可吹牛的內(nèi)容都是我干的抛虫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼简僧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼建椰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起岛马,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棉姐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后啦逆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體伞矩,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蹦浦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扭吁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盲镶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枫吧,到底是詐尸還是另有隱情九杂,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布例隆,位于F島的核電站镀层,受9級(jí)特大地震影響唱逢,放射性物質(zhì)發(fā)生泄漏坞古。R本人自食惡果不足惜织堂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闽烙。 院中可真熱鬧黑竞,春花似錦很魂、人聲如沸遏匆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葛超。三九已至绣张,卻和暖如春侥涵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背好芭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裙戏,地道東北人累榜。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓寿羞,卻偏偏與公主長(zhǎng)得像绪穆,于是被迫代替她去往敵國(guó)和親菠红。 傳聞我的和親對(duì)象是個(gè)殘疾皇子途乃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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