簡談Thread Local工作原理

簡談Thread Local工作原理

  • 什么是Thread Local?

    • Thread Local 是一個線程內(nèi)部的數(shù)據(jù)存儲類苍匆,每一個線程都維護(hù)一個table[],通過set(),get()方法實現(xiàn)存取操作辕羽。

    • 只能在指定的線程中獲取存儲的數(shù)據(jù)运翼,其他的線程一般無法獲取然爆。(注意:這里我用的是一般,可以使用InheritableThreadLocal達(dá)到其他線程獲取數(shù)據(jù)的)

  • 什么情況下使用Thread Local呢?

    • 一般來說七咧,當(dāng)某些數(shù)據(jù)以線程為作用域并且不同線程具有不同的數(shù)據(jù)副本時改执,就考慮用它了

    • 典型的例子是:Handler要獲取當(dāng)前線程的Looper,Looper的作用域為線程坑雅,每個線程具有不同的Looper.

Thread Local的使用方法

   private void testThreadLocal() {
    new Thread(new Runnable() {
        //創(chuàng)建ThreadLocal 對象辈挂,支持泛型
        ThreadLocal<String> mLocal = new ThreadLocal<String>();
        @Override
        public void run() {
            mLocal.set("Fan Bin Bin is nice!");
            String s = mLocal.get();
            Log.i("TAG", s);
        }
    }).start();
}

打印結(jié)果:
threadlocaltest I/TAG: Fan Bin Bin is nice!

有一個特殊的例子可以實現(xiàn)不同線程的訪問存儲變量

  private void testThreadLocal() {
    final ThreadLocal<String> local = new InheritableThreadLocal<>();
    local.set("I love China");
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.i("TAG", local.get() + "");
        }
    }).start();
}

打印結(jié)果:

com.yutianwang.threadlocaltest I/TAG: I love China

這里在主線程中創(chuàng)建了InheritableThreadLocal對象,居然在子線程中能夠打印出這句話裹粤,實現(xiàn)原理大致是:當(dāng)子線程創(chuàng)建的時候终蒂,主線程會將InheritableThreadLocal對象傳遞給子線程中去,所以能夠打印這句話遥诉。

a.png

LocalValues內(nèi)部有個數(shù)組:private Object[] table,Thread local的值就存儲在這個table數(shù)組中

b.png

取出當(dāng)前線程LocalValues對象拇泣,如果為null,返回初始值,如果不為空矮锈,從table數(shù)組中取出Thread Local值

總結(jié)

Thread Local所做的讀寫操作僅限于各自線程的內(nèi)部霉翔,所以在多個線程中互補(bǔ)干擾的存儲和修改數(shù)據(jù)。

聲明

此文是建立在《Android開發(fā)藝術(shù)探索》和

http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/
這篇文章基礎(chǔ)上的讀書筆記苞笨。(PS:準(zhǔn)大三狗真是累债朵!hh)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瀑凝,隨后出現(xiàn)的幾起案子序芦,更是在濱河造成了極大的恐慌,老刑警劉巖粤咪,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谚中,死亡現(xiàn)場離奇詭異,居然都是意外死亡寥枝,警方通過查閱死者的電腦和手機(jī)宪塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囊拜,“玉大人某筐,你說我怎么就攤上這事“保” “怎么了来吩?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵敢辩,是天一觀的道長蔽莱。 經(jīng)常有香客問我,道長戚长,這世上最難降的妖魔是什么盗冷? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮同廉,結(jié)果婚禮上仪糖,老公的妹妹穿的比我還像新娘柑司。我一直安慰自己锅劝,他們只是感情好攒驰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著故爵,像睡著了一般玻粪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诬垂,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天劲室,我揣著相機(jī)與錄音,去河邊找鬼结窘。 笑死很洋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隧枫。 我是一名探鬼主播喉磁,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼官脓!你這毒婦竟也來了线定?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤确买,失蹤者是張志新(化名)和其女友劉穎斤讥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾趾,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芭商,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀缠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铛楣。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艺普,靈堂內(nèi)的尸體忽然破棺而出簸州,到底是詐尸還是另有隱情,我是刑警寧澤歧譬,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布岸浑,位于F島的核電站,受9級特大地震影響瑰步,放射性物質(zhì)發(fā)生泄漏矢洲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一缩焦、第九天 我趴在偏房一處隱蔽的房頂上張望读虏。 院中可真熱鬧责静,春花似錦、人聲如沸盖桥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩徊。三九已至睦焕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靴拱,已是汗流浹背垃喊。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袜炕,地道東北人本谜。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像偎窘,于是被迫代替她去往敵國和親乌助。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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