一個線程安全問題引發(fā)的ThreadLocal類探索

背景: 今天在開發(fā)項目的時候碰到一個線程安全的問題诉位。具體的情況是這樣的赎婚,服務(wù)是基于dubbo對外提供服務(wù)的逊彭。所有的請求就是java服務(wù)多線程處理的瓦戚。我寫的一個類里面有多個方法需要重復(fù)的查詢DB來獲取數(shù)據(jù)团驱,使用希望定義一個全局變量來保存摸吠,只需要查詢一次即可。但是由于是一個靜態(tài)變量在多線程環(huán)境下面是不安全的嚎花。所以需要一個辦法來讓靜態(tài)變量在線程與線程直接互相獨立寸痢,互不干擾。后經(jīng)同事的提醒贩幻,可以用ThreadLocal來解決轿腺,所以先對這個類進(jìn)行了一次了解。

探索過程

首先要了解java變量作用域的問題丛楚。

靜態(tài)變量: 線程非安全族壳。靜態(tài)變量即類變量,位于方法區(qū)趣些,為所有對象共享仿荆,共享一份內(nèi)存,一旦靜態(tài)變量被修改,其他對象均對修改可見拢操,故線程非安全锦亦。
實例變量: 單例模式(只有一個對象實例存在)線程非安全,非單例線程安全令境。實例變量為對象實例私有杠园,在虛擬機的堆中分配,若在系統(tǒng)中只存在一個此對象的實例舔庶,在多線程環(huán)境下抛蚁,“猶如”靜態(tài)變量那樣,被某個線程修改后惕橙,其他線程對修改均可見瞧甩,故線程非安全;如果每個線程執(zhí)行都是在不同的對象中,那對象與對象之間的實例變量的修改將互不影響,故線程安全嚷兔。
局部變量: 線程安全芭挽。每個線程執(zhí)行時將會把局部變量放在各自棧幀的工作內(nèi)存中,線程間不共享,故不存在線程安全問題。

這里我使用的是靜態(tài)變量,多線程下面變量的內(nèi)存區(qū)域是共享的思灰。這就意味著當(dāng)一個線程給這個變量負(fù)責(zé)了a下面的邏輯需要這個變量為a才能保證邏輯正確,但是此時另外一個線程將這個變量改成了b混滔。咔~~洒疚,程序邏輯就錯了。而且這種還不是語法錯坯屿,還是偶然性的油湖,出問題的時候可能就需要花很多時間來排查問題。


那ThreadLocal是怎么避免這個問題呢.
原理大概是一個線程的map领跛,可以理解為Map<Thread, Map<K, V>>這樣的結(jié)果乏德,Thread就是線程號了,下面的map就是我們使用存儲的值吠昭。
詳細(xì)內(nèi)容看這里深入剖析ThreadLocal實現(xiàn)原理以及內(nèi)存泄漏問題
在這篇文章里面同時也引入了另外一個問題喊括,ThreadLocal內(nèi)存泄露的問題。

ThreadLocalMap使用ThreadLocal的弱引用作為key矢棚,如果一個ThreadLocal沒有外部強引用來引用它郑什,那么系統(tǒng) GC 的時候,這個ThreadLocal勢必會被回收蒲肋,這樣一來蘑拯,ThreadLocalMap中就會出現(xiàn)key為null的Entry钝满,就沒有辦法訪問這些key為null的Entry的value,如果當(dāng)前線程再遲遲不結(jié)束的話申窘,這些key為null的Entry的value就會一直存在一條強引用鏈:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永遠(yuǎn)無法回收弯蚜,造成內(nèi)存泄漏。
其實剃法,ThreadLocalMap的設(shè)計中已經(jīng)考慮到這種情況碎捺,也加上了一些防護(hù)措施:在ThreadLocal的get(),set(),remove()的時候都會清除線程ThreadLocalMap里所有key為null的value。

原文鏈接

順便去喵了一眼這個博主的博客贷洲,才知道他還沒有畢業(yè)牵寺。看看他在大學(xué)里面干的事情恩脂,再回想自己當(dāng)年大學(xué)里面是浪費了多少時間。多么無知趣斤。

最后帶一個使用方法吧俩块,看這些博文里面都沒有寫怎么用

private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
threadLocal.set(100L);
threadLocal.get();
threadLocal.remove();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浓领,隨后出現(xiàn)的幾起案子玉凯,更是在濱河造成了極大的恐慌,老刑警劉巖联贩,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漫仆,死亡現(xiàn)場離奇詭異,居然都是意外死亡泪幌,警方通過查閱死者的電腦和手機盲厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祸泪,“玉大人吗浩,你說我怎么就攤上這事∶话” “怎么了懂扼?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長右蒲。 經(jīng)常有香客問我阀湿,道長,這世上最難降的妖魔是什么瑰妄? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任陷嘴,我火速辦了婚禮,結(jié)果婚禮上翰撑,老公的妹妹穿的比我還像新娘罩旋。我一直安慰自己啊央,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布涨醋。 她就那樣靜靜地躺著瓜饥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浴骂。 梳的紋絲不亂的頭發(fā)上乓土,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音溯警,去河邊找鬼趣苏。 笑死,一個胖子當(dāng)著我的面吹牛梯轻,可吹牛的內(nèi)容都是我干的食磕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼喳挑,長吁一口氣:“原來是場噩夢啊……” “哼彬伦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伊诵,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤单绑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曹宴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂橙,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年笛坦,在試婚紗的時候發(fā)現(xiàn)自己被綠了区转。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡弯屈,死狀恐怖蜗帜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情资厉,我是刑警寧澤厅缺,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站宴偿,受9級特大地震影響湘捎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窄刘,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一窥妇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娩践,春花似錦活翩、人聲如沸烹骨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沮焕。三九已至,卻和暖如春拉宗,著一層夾襖步出監(jiān)牢的瞬間峦树,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工旦事, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁巩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓姐浮,卻偏偏與公主長得像谷遂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卖鲤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 從三月份找實習(xí)到現(xiàn)在埋凯,面了一些公司,掛了不少扫尖,但最終還是拿到小米、百度掠廓、阿里换怖、京東、新浪蟀瞧、CVTE沉颂、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,218評論 11 349
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 7,627評論 4 30
  • 前言 ThreadLocal很多同學(xué)都搞不懂是什么東西,可以用來干嘛悦污。但面試時卻又經(jīng)常問到铸屉,所以這次我和大家一起學(xué)...
    liangzzz閱讀 12,431評論 14 228
  • 原創(chuàng)文章&經(jīng)驗總結(jié)&從校招到A廠一路陽光一路滄桑 詳情請戳www.codercc.com 1. ThreadLoc...
    你聽___閱讀 6,731評論 8 19
  • 使用nvm管理node的版本 使用淘寶源可以加快安裝速度:http://npm.taobao.org/
    Juude閱讀 352評論 0 0