<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的值

          共 2001字,需瀏覽 5分鐘

           ·

          2022-04-11 17:00

          點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛,請?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看”

          來源:blog.csdn.net/weixin_44912855
          • 子線程如何獲取父線程ThreadLocal的值

          最近微信群里一個(gè)網(wǎng)友分享了他京東一面的過程,我這里分享給大家其中一道面試題。
          京東一面」子線程如何獲取父線程ThreadLocal的值

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

          圖片
          想要子線程獲取父線程中 ThreadLocal 中的值,需要其子類 InheritableThreadLocal 實(shí)現(xiàn)。
          測試代碼如下:
          public?static?void?main(String[]?args)?throws?InterruptedException?{
          ????Thread?parentParent?=?new?Thread(()?->?{
          ????????ThreadLocal?threadLocal?=?new?ThreadLocal<>();
          ????????threadLocal.set(1);
          ????????InheritableThreadLocal?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()方法沒什么好看的,就是ThreadLocal的get()方法。
          圖片
          注意:InheritableThreadLocal 對(duì)ThreadLocal 的getMap()方法進(jìn)行重寫
          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類,并重寫了childValue、getMap、createMap方法。
          其中createMap方法在被調(diào)用的時(shí)候,創(chuàng)建的是inheritableThreadLocal而不是threadLocals。
          同理,getMap方法在當(dāng)前調(diào)用者線程調(diào)用get方法的時(shí)候返回的也不是threadLocals而是inheritableThreadLocal。

          (完)

          碼農(nóng)突圍資料鏈接

          1、臥槽!字節(jié)跳動(dòng)《算法中文手冊》火了,完整版 PDF 開放下載!
          2、計(jì)算機(jī)基礎(chǔ)知識(shí)總結(jié)與操作系統(tǒng) PDF 下載
          3、艾瑪,終于來了!《LeetCode Java版題解》.PDF
          4、Github 10K+,《LeetCode刷題C/C++版答案》出爐.PDF

          歡迎添加魚哥個(gè)人微信:smartfish2020,進(jìn)粉絲群或圍觀朋友圈。

          瀏覽 25
          點(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>
                  亚洲色婷 | 在线免费看黄片 | 免费看黄片网站在线观看 | 色婷婷之 | 18禁操逼 |