📜  Java.lang.InheritableThreadLocal类(1)

📅  最后修改于: 2023-12-03 14:42:20.978000             🧑  作者: Mango

Java.lang.InheritableThreadLocal类介绍

简介

java.lang.InheritableThreadLocal是Java语言中的一个类,用于创建一个能够继承父线程的线程本地变量。它是ThreadLocal类的子类。

InheritableThreadLocal的作用是为每个线程提供独立的变量副本,确保线程之间不会相互干扰。

特点
  • InheritableThreadLocal继承自ThreadLocal,因此具有ThreadLocal的所有特性和功能。
  • ThreadLocal不同的是,InheritableThreadLocal的值在创建线程时可以从父线程继承,子线程可以访问父线程设置的值。
  • 每个线程对InheritableThreadLocal的修改不会影响其他线程的副本值,每个线程都有自己的副本。
使用示例
import java.lang.InheritableThreadLocal;

public class InheritableThreadLocalExample {
    private static InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<>();

    public static void main(String[] args) {
        threadLocal.set("Hello, World!");

        Thread childThread = new Thread(() -> {
            System.out.println("Child Thread: " + threadLocal.get());
            threadLocal.set("Hello from Child Thread!");
            System.out.println("Child Thread (after modification): " + threadLocal.get());
        });

        childThread.start();

        try {
            childThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main Thread: " + threadLocal.get());
    }
}

上述示例代码中,主线程设置了InheritableThreadLocal的值为"Hello, World!"。子线程获取了主线程的值,并在自己的副本中修改了值。最后,主线程再次获取了自己的副本值。

运行上述代码,输出结果如下:

Child Thread: Hello, World!
Child Thread (after modification): Hello from Child Thread!
Main Thread: Hello, World!

可以看到,子线程成功继承了父线程的副本值,并且对副本值的修改只在子线程中生效,不影响父线程的副本值。

总结

InheritableThreadLocal提供了一种在多线程环境下为每个线程创建独立副本的方式,并能在线程之间传递父线程的副本值。使用InheritableThreadLocal可以方便地实现线程间的数据隔离和共享,并避免了线程安全问题。