使用场景: 拦截器赋值(ThreadLocal.set),不依赖上下文传参,同一个线程内传值(ThreadLocal.get) 使用现象: 在父线程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
}
作用: 线程隔离、线程独享 看源码: threadLocal.set/threadLocal.get
看着像threadLocal1.set、threadLocal2.set
,
实际是Thread.currentThread().ThreadLocalMap.set(ThreadLocal threadLocal1, Object value)、 Thread.currentThread().ThreadLocalMap.set(ThreadLocal threadLocal2, Object value)
实现线程隔离
看源码...InheritableThreadLocal
由此可见,只是copy,并不共享,copy之后还是隔离
验证....
优点: 减少代码侵入 缺点: 不易维护