ThreadLocal和InheritableThreadLocal的区别

ThreadLocal不能往子线程传递参数。

InheritableThreadLocal可以往子线程传递参数。

写一个存放环境变量的类

public class MyInheritableThreadLocal {
    private static final ThreadLocal CONTEXTHOLDER = new ThreadLocal();

    public MyInheritableThreadLocal() {
    }

    public static void set(String key) {
        CONTEXTHOLDER.set(key);
    }

    public static String get() {
        return CONTEXTHOLDER.get();
    }

    public static void clear() {
        CONTEXTHOLDER.remove();
    }
}

测试类

public class MyThreadLocalTest3 {

    public static void main(String[] args) {
        for (int i = 0; i <5 ; i++) {
            MyInheritableThreadLocal.set(""+i);
            aa();
        }
    }

    private static void aa() {
        System.out.println("aa start:"+MyInheritableThreadLocal.get());
        new Thread(() -> System.out.println("get value success:"+MyInheritableThreadLocal.get())).start();
    }
}

输出结果:

ThreadLocal和InheritableThreadLocal的区别_第1张图片

发现aa方法中可以获取,再新起一个线程,则无法获取MyInheritableThreadLocal中的值。

MyInheritableThreadLocal改为new InheritableThreadLocal()

public class MyInheritableThreadLocal {
    private static final InheritableThreadLocal CONTEXTHOLDER = new InheritableThreadLocal();

    public MyInheritableThreadLocal() {
    }

    public static void set(String key) {
        CONTEXTHOLDER.set(key);
    }

    public static String get() {
        return CONTEXTHOLDER.get();
    }

    public static void clear() {
        CONTEXTHOLDER.remove();
    }
}

执行测试类,结果

ThreadLocal和InheritableThreadLocal的区别_第2张图片

成功获取InheritableThreadLocal的值

在Thread的初始化中,会判断是否是可继承线程,是的话,就把parent线程的值,赋给子线程。

ThreadLocal和InheritableThreadLocal的区别_第3张图片

你可能感兴趣的:(多线程,多线程)