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

一、首先你們都知道ThreadLocal中的get之因此可以保證線程安全是依賴於每一個線程都會有一個ThreadLocalMap.java

當執行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的時候都是準確的。this

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

而後問題來了如何去解決這個問題呢?對象

參考 InheritableThreadLocalblog

三、可是用了InheritableThreadLocal還有坑....get

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

這時候能夠考慮下線程池的策略。。。table

後續再研究中.......

注:只是本身的看法不必定對,僅供參考。

相關文章
相關標籤/搜索