ThreadLocal子線程共享及源碼分析

一、發(fā)現(xiàn)問題

使用場景: 攔截器賦值(ThreadLocal.set),不依賴上下文傳參,同一個線程內(nèi)傳值(ThreadLocal.get)
使用現(xiàn)象: 在父線程ThreadLocal.set,子線程get不到值。

    private final static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) throws InterruptedException {
        threadLocal.set("MainSet");
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(() -> {
            System.out.println(Thread.currentThread().getName() + " get => " + threadLocal.get());
        });
        Thread.sleep(1000);
        executorService.shutdown();
        System.out.println("Main - end");
        
        // out =>
        // pool-1-thread-1 get => null
        // Main - end
    }

二、解決方案

  1. 傳參傳進子線程。
  2. 使用InheritableThreadLocal。

三、ThreadLocal介紹

作用: 線程隔離、線程獨享
看源碼: threadLocal.set/threadLocal.get

image.png

看著像threadLocal1.set、threadLocal2.set,
實際是Thread.currentThread().ThreadLocalMap.set(ThreadLocal threadLocal1, Object value)、 Thread.currentThread().ThreadLocalMap.set(ThreadLocal threadLocal2, Object value)

image.png

實現(xiàn)線程隔離


image.png

四、為什么InheritableThreadLocal可以實現(xiàn)子線程傳遞

看源碼...InheritableThreadLocal

image.png

由此可見,只是copy,并不共享,copy之后還是隔離
驗證....

五、應(yīng)用場景

  1. 攔截器,獲取上下文。
  2. PageHelper。

優(yōu)點: 減少代碼侵入
缺點: 不易維護

六、下期講解

  1. 內(nèi)部Map結(jié)構(gòu)、解決hash沖突方式、與jdkHashMap、redis-hash的比較。
  2. 弱引用、弱引用導(dǎo)致的內(nèi)存泄漏。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容