Java 中的 InheritableThreadLocal 是什么?

Sherwin.Wei Lv7

Java 中的 InheritableThreadLocal 是什么?

回答重点

InheritableThreadLocalThreadLocal 的一个扩展,用于在线程创建时将父线程的 ThreadLocal 变量副本传递给子线程,使得子线程可以访问父线程中设置的本地变量。它解决了 ThreadLocal 无法在子线程中继承父线程本地变量的问题。

工作原理

  • 当创建子线程时,InheritableThreadLocal 的值会被自动拷贝到子线程中。
  • 子线程可以修改自己的副本,但不会影响父线程的值。

扩展知识

源码分析

原理其实很简单,在 Thread 中已经包含了这个成员:

image.png

在父线程创建子线程的时候,子线程的构造函数可以得到父线程,然后判断下父线程的 InheritableThreadLocal 是否有值,如果有的话就拷过来。

image.png

这里要注意,只会在线程创建的时会拷贝 InheritableThreadLocal 的值,之后父线程如何更改,子线程都不会受其影响。

示例代码

使用方式和 ThreadLocal 一致,无非就是将类替换成 InheritableThreadLocal 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class InheritableThreadLocalExample {

// 创建一个 InheritableThreadLocal 用来存储上下文信息
private static final InheritableThreadLocal<String> context = new InheritableThreadLocal<>();

public static void main(String[] args) {
// 设置父线程中的变量
context.set("Parent Thread Data");

// 创建子线程
Thread childThread = new Thread(() -> {
System.out.println("Child Thread Initial Value: " + context.get());

// 子线程中修改值
context.set("Child Thread Data");
System.out.println("Child Thread Modified Value: " + context.get());
});

// 启动子线程
childThread.start();

// 主线程输出
System.out.println("Parent Thread Value: " + context.get());
}
}
Comments