<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          子線程如何獲取父線程ThreadLocal的值

          共 2841字,需瀏覽 6分鐘

           ·

          2022-04-24 13:55

          上一篇:2T架構(gòu)師學(xué)習(xí)資料干貨分享


          原文: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é)果如下:

          子線程獲取父線程中 ThreadLocal 中的值

          原理如下:

          首先我們要知道 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。


          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。 
              · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.救救大齡碼農(nóng)!45歲程序員在國(guó)務(wù)院網(wǎng)站求助總理!央媒網(wǎng)評(píng)來(lái)了...

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問(wèn)版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男人天堂色色网 | 无码一区二区三区四区精品 | 日本熟女性爱视频 | 欧美成a 秋霞乱伦 | 精品卡一卡2卡3卡4卡在线 |