众所周知,使用InheritableThreadLocal可以实现父子线程之间的值传递,不过使用InheritableThreadLocal有一个隐藏的问题,子线程在创建的时候会从父线程InheritableThreadLocal中拷贝数据,一旦子线程创建成功以后,父线程更新了数据,对子线程是无效的,这种情况在使用线程池的时候会有数据不安全的问题,下面使用代码演示一下:
public class ITLTest {
// 声明一个线程池
private static final ExecutorService pool = Executors.newFixedThreadPool(2);
// 声明一个InheritableThreadLocal全局变量
private static final ThreadLocal<String> tl = new InheritableThreadLocal<>();
public static void main(String[] args) {
// 设置一个值
tl.set("张三");
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
// 声明一个Runnable对象
Runnable r1 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
};
// 向线程池提交
pool.submit(r1);
// 声明一个Callable对象
Callable<String> c1 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
return "success";
};
// 向线程池提交
pool.submit(c1);
tl.set("李四"); // 更新tl中的值
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--->" + tl.get

本文通过实例对比了InheritableThreadLocal与TransmittableThreadLocal在线程池中的表现,展示了如何使用TransmittableThreadLocal解决线程间数据同步问题。
最低0.47元/天 解锁文章
484





