TransmittableThreadLocal
是一个线程本地变量的实现,它是在 Java 语言中使用的一个类。与普通的 ThreadLocal
不同,TransmittableThreadLocal
允许在线程之间传递值。
在多线程环境下,每个线程可以独立地访问自己的线程本地变量,而不会干扰其他线程的变量。ThreadLocal
变量的值只对所属线程可见。
TransmittableThreadLocal
在此基础上提供了额外的功能。当线程在执行过程中切换到另一个线程时(例如,使用线程池),通过 TransmittableThreadLocal
可以保留原始线程的变量值,并在切换后恢复这些值,使得新线程能够继续使用原始线程的变量。
这种特性在一些应用场景中非常有用,特别是在线程池、异步任务等需要跨线程传递上下文或状态的情况下。
1.普通的ThreadLocal会让子线程获取不到get值
public class Example {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("Hello, World!");
// 创建一个线程并启动
Thread thread = new Thread(() -> {
String value = threadLocal.get();
System.out.println(value); // 输出 "Hello, World!"
new Thread(() -> {System.out.println(threadLocal.get())}).start();
});
thread.start();
// 等待线程执行完毕
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
threadLocal.remove();
}
}
结果:
null
null
2.使用TransmittableThreadLocal:
import com.alibaba.ttl.TransmittableThreadLocal;
public class Example {
private static TransmittableThreadLocal<String> threadLocal = new TransmittableThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("Hello, World!");
// 创建一个线程并启动
Thread thread = new Thread(() -> {
String value = threadLocal.get();
System.out.println(value); // 输出 "Hello, World!"
new Thread(() -> {System.out.println(threadLocal.get())}).start();
});
thread.start();
// 等待线程执行完毕
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
threadLocal.remove();
}
}
输出结果:Hello, World!
Hello, World!
3.使用只有一个线程的线程池,测试线程复用是否影响TransmittableThreadLocal的效果
需要注意的是,TransmittableThreadLocal
是 Alibaba 开源的一个库,需要引入 transmittable-thread-local
的依赖才能使用。具体的引入方式可以根据项目构建工具(如 Maven、Gradle)来配置。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.11.4</version>
</dependency>