如何解決ThreadLocal在異步調用中的問題


1、首先大家都知道ThreadLocal中的get之所以能夠保證線程安全是依賴於每個線程都會有一個ThreadLocalMap.

當執行set方法的時候首先會獲取當前線程的ThreadLocalMap,然后給map賦值。

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 當之前get方法的時候也會獲取當前線程的ThreadLocalMap,然后從map中獲取,

由於Map的key是this並且是在當前線程中所以才能保證每次get的時候都是准確的。

2、由於每次獲取的時候都是在當前線程而沒有考慮當前線程的子線程,那么在異步調用的時候使用ThreadLocal就會發生獲取不到子線程里面set進去的值

然后問題來了如何去解決這個問題呢?

參考 InheritableThreadLocal

3、但是用了InheritableThreadLocal還有坑....

如果你用的是線程池,當線程池達到最大線程數量的時候這時候在創建的線程就不是當前線程的子線程,這時候你ThreadLoca.get()出來的對象就不是你想要的那個。

這時候可以考慮下線程池的策略。。。

后續再研究中.......

注:只是自己的見解不一定對,僅供參考。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM