Thread 的threadLocals 和 inheritableThreadLocals

兩者什么差異呢,咱們來看下源碼中的官方注釋?


/* ThreadLocal values pertaining to this thread. This map is maintained

* by the ThreadLocal class. */

ThreadLocal.ThreadLocalMap threadLocals =null;
/*

? ? * InheritableThreadLocal values pertaining to this thread. This map is

? ? * maintained by the InheritableThreadLocal class.

? ? */

? ? ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;


都是Thread的變量,看著是不是幾乎一樣. 正如inheritableThreadLocals 變量比threadLocals名稱多的inheritable.
這里inheritableThreadLocals是可繼承的.
這是什么意思呢?:
1)我們知道threadLocals 是線程獨(dú)有的,也就是線程安全的.我們可將對線程安全 有要求的對象存在這里備用.
2)但是這里使用inheritableThreadLocals,a繼承b,則a線程內(nèi)部的inheritableThreadLocals會持有b中的值.

如何使用呢?
1)我們首先,針對threadLocals 和inheritableThreadLocals, 有兩個類:ThreadLocal 和InheritableThreadLocal
2)之前如何使用,將其替換就可以
Thread-A:
ThreadLocal threadLocal? = new new ThreadLocal<Object>(); //使用ThreadLocal的方式
Thread-B:
ThreadLocal threadLocal? = new new InheritableThreadLocal <Object>();//使用InheritableThreadLocal的方式

這個能力是如何實現(xiàn)的呢?
這個我們要看構(gòu)造Thread的時候做了什么
//Thread
private void init(ThreadGroup g, Runnable target, String name,

? ? ? ? ? ? ? ? ? ? ? long stackSize, AccessControlContext acc,

? ? ? ? ? ? ? ? ? ? ? boolean inheritThreadLocals) {

? ? ? ........

? ? ? ? if (inheritThreadLocals && parent.inheritableThreadLocals != null) //這里inheritThreadLocals 一直是true

? ? ? ? ? ? this.inheritableThreadLocals =

? ? ? ? ? ? ? ? ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); //這里是關(guān)鍵

? ? ? ......

}
ThreadLocal.createInheritedMap 又做了什么呢?

private ThreadLocalMap(ThreadLocalMap parentMap) {

? ? ? ? ? ? Entry[] parentTable = parentMap.table;

? ? ? ? ? ? int len = parentTable.length;

? ? ? ? ? ? setThreshold(len);

? ? ? ? ? ? table = new Entry[len];

? ? ? ? ? ? for (int j = 0; j < len; j++) {

? ? ? ? ? ? ? ? Entry e = parentTable[j];

? ? ? ? ? ? ? ? if (e != null) {

? ? ? ? ? ? ? ? ? ? @SuppressWarnings("unchecked")

? ? ? ? ? ? ? ? ? ? ThreadLocal<Object> key = (ThreadLocal<Object>) e.get();

? ? ? ? ? ? ? ? ? ? if (key != null) {

? ? ? ? ? ? ? ? ? ? ? ? Object value = key.childValue(e.value);

? ? ? ? ? ? ? ? ? ? ? ? Entry c = new Entry(key, value);

? ? ? ? ? ? ? ? ? ? ? ? int h = key.threadLocalHashCode & (len - 1);

? ? ? ? ? ? ? ? ? ? ? ? while (table[h] != null)

? ? ? ? ? ? ? ? ? ? ? ? ? ? h = nextIndex(h, len);

? ? ? ? ? ? ? ? ? ? ? ? table[h] = c;

? ? ? ? ? ? ? ? ? ? ? ? size++;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }
我們看到所有的數(shù)值parentMap的值copy了一份到當(dāng)前的線程table中,我們?nèi)〉脮r候回去這里取:
private Entry getEntry(ThreadLocal<?> key) {

? ? ? ? ? ? int i = key.threadLocalHashCode & (table.length - 1);

? ? ? ? ? ? Entry e = table[i];

? ? ? ? ? ? if (e != null && e.get() == key)

? ? ? ? ? ? ? ? return e;

? ? ? ? ? ? else

? ? ? ? ? ? ? ? return getEntryAfterMiss(key, i, e);

? ? ? ? }


其實用的時候,就當(dāng)做一個普通陌生的黑盒使用就好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玻靡,一起剝皮案震驚了整個濱河市响迂,隨后出現(xiàn)的幾起案子晶府,更是在濱河造成了極大的恐慌藕施,老刑警劉巖摩幔,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳殖,死亡現(xiàn)場離奇詭異铐尚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哆姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門宣增,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矛缨,你說我怎么就攤上這事爹脾√迹” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵灵妨,是天一觀的道長解阅。 經(jīng)常有香客問我,道長泌霍,這世上最難降的妖魔是什么货抄? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮朱转,結(jié)果婚禮上碉熄,老公的妹妹穿的比我還像新娘。我一直安慰自己肋拔,他們只是感情好锈津,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凉蜂,像睡著了一般琼梆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窿吩,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天茎杂,我揣著相機(jī)與錄音,去河邊找鬼纫雁。 笑死煌往,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轧邪。 我是一名探鬼主播刽脖,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忌愚!你這毒婦竟也來了曲管?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硕糊,失蹤者是張志新(化名)和其女友劉穎院水,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體简十,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檬某,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了螟蝙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恢恼。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胶逢,靈堂內(nèi)的尸體忽然破棺而出厅瞎,到底是詐尸還是另有隱情饰潜,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布和簸,位于F島的核電站彭雾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锁保。R本人自食惡果不足惜薯酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爽柒。 院中可真熱鬧吴菠,春花似錦、人聲如沸浩村。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心墅。三九已至酿矢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怎燥,已是汗流浹背瘫筐。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐姚,地道東北人策肝。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像隐绵,于是被迫代替她去往敵國和親之众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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