子線程如何獲取父線程ThreadLocal的值
原文:www.blog.csdn.net/weixin_44912855
最近微信群里一個(gè)網(wǎng)友分享了他京東一面的過(guò)程,我這里分享給大家其中一道面試題。
京東一面」子線程如何獲取父線程ThreadLocal的值
子線程如何獲取父線程ThreadLocal的值
想要子線程獲取父線程中 ThreadLocal 中的值,需要其子類 InheritableThreadLocal 實(shí)現(xiàn)。
測(cè)試代碼如下:
public static void main(String[] args) throws InterruptedException {
Thread parentParent = new Thread(() -> {
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(1);
InheritableThreadLocal<Integer> inheritableThreadLocal = new InheritableThreadLocal<>();
inheritableThreadLocal.set(2);
new Thread(() -> {
System.out.println("threadLocal=" + threadLocal.get());
System.out.println("inheritableThreadLocal=" + inheritableThreadLocal.get());
}).start();
}, "父線程");
parentParent.start();
}
運(yùn)行結(jié)果如下:
原理如下:
首先我們要知道 Thread類維護(hù)了兩個(gè)ThreadLocalMap
跟進(jìn) new Thread() 方法
其構(gòu)造方法調(diào)用了init方法, init方法把inheritThreadLocals值設(shè)置為了true

繼續(xù)跟進(jìn)。
當(dāng)inheritThreadLocals的值為true并且其父線程的inheritableThreadLocals不為null時(shí), 把其父線程inheritableThreadLocals 賦值給當(dāng)前線程的inheritableThreadLocals

這就是子線程可以獲取到父線程ThreadLocal值的關(guān)鍵。
繼續(xù)跟進(jìn) 看看 InheritableThreadLocal 的get() 方法
get()方法沒(méi)什么好看的,就是ThreadLocal的get()方法。

注意:InheritableThreadLocal 對(duì)ThreadLocal 的getMap()方法進(jìn)行重寫(xiě)
ThreadLocalMap getMap(Thread t) {
//獲取線程自己的變量threadLocals,并綁定到當(dāng)前調(diào)用線程的成員變量threadLocals上
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
//創(chuàng)建給ThreadLocalMap的table屬性賦值,并且將firstValue放在數(shù)組首位。
}
createMap方法不僅創(chuàng)建了threadLocals,同時(shí)也將要添加的本地變量值添加到了threadLocals中。
InheritableThreadLocal類繼承了ThreadLocal類,并重寫(xiě)了childValue、getMap、createMap方法。
其中createMap方法在被調(diào)用的時(shí)候,創(chuàng)建的是inheritableThreadLocal而不是threadLocals。
同理,getMap方法在當(dāng)前調(diào)用者線程調(diào)用get方法的時(shí)候返回的也不是threadLocals而是inheritableThreadLocal。
正文結(jié)束
1.救救大齡碼農(nóng)!45歲程序員在國(guó)務(wù)院網(wǎng)站求助總理!央媒網(wǎng)評(píng)來(lái)了...
3.從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5.37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...
6.IntelliJ IDEA 2019.3 首個(gè)最新訪問(wèn)版本發(fā)布,新特性搶先看

