https://blog.csdn.net/weixin_47493863/article/details/136605583
在Java中,ThreadLocal
变量是线程隔离的,即每个线程都有自己的ThreadLocal
变量副本,一个线程设置的值对其他线程是不可见的。所以,通常情况下子线程无法直接获取父线程的ThreadLocal
的值。
如果你需要在父线程和子线程之间共享ThreadLocal
变量,你可以采用以下策略之一:
ThreadLocal
中取出相应的值,然后将这个值作为参数传递给子线程。这样子线程就可以使用从父线程传递来的值了。使用InheritableThreadLocal
,一个示例代码如下:
public static void main(String[] args) {
Thread parentThread = new Thread(() -> {
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(1);
InheritableThreadLocal<Integer> integerInheritableThreadLocal = new InheritableThreadLocal<>();
integerInheritableThreadLocal.set(2);
new Thread(()->{
System.out.println("threadLocal = " + threadLocal.get());
System.out.println("integerInheritableThreadLocal = " + integerInheritableThreadLocal.get());
}).start();
},"parentThread");
parentThread.start();
}
使用InheritableThreadLocal时需要谨慎采用,因为它会有一些性能开销,并且在使用线程池时,子任务可能会继承到先前任务在父线程中设置的值,这可能会导致不可预见的数据共享问题。