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()出來的對象就不是你想要的那個。
這時候可以考慮下線程池的策略。。。
后續再研究中.......
注:只是自己的見解不一定對,僅供參考。