在Java中,ThreadLocal
变量是线程隔离的,即每个线程都有自己的ThreadLocal
变量副本,一个线程设置的值对其他线程是不可见的。所以,通常情况下子线程无法直接获取父线程的ThreadLocal
的值。
如果你需要在父线程和子线程之间共享ThreadLocal
变量,你可以采用以下策略之一:
-
在子线程创建之前手动传递: 在创建子线程之前从父线程的
ThreadLocal
中取出相应的值,然后将这个值作为参数传递给子线程。这样子线程就可以使用从父线程传递来的值了。 -
使用InheritableThreadLocal: Java提供了一个
InheritableThreadLocal
类,它扩展了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
时需要谨慎采用,因为它会有一些性能开销,并且在使用线程池时,子任务可能会继承到先前任务在父线程中设置的值,这可能会导致不可预见的数据共享问题。