一、首先你们都知道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
后续再研究中.......
注:只是本身的看法不必定对,仅供参考。