ThreadLocal的使用

什么是ThreadLocal

ThreadLocal:每个线程独立放数据的地方,可以理解为web浏览器的LocalStorage
常用方法有:init、set、get、init、remove

/**
 * ThreadLocal:每个线程独立放数据的地方
 * 官网推荐使用private static修饰
 * @author wcong
 * @version 1.0
 * @date 2020-08-06 16:50
 */
public class ThreadLocalTest {
//    默认泛型为Object
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
    @Override
    protected Integer initialValue() {
//        使用内部类初始化值
        return 100;
    }
};

    public static void main(String[] args) {
        threadLocal.set(520);
        System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get());

//        创建一个新的线程,新的线程拿到的还是初始值
        new Thread(()-> System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get())).start();
    }
}

运行结果如下
ThreadLocal的使用_第1张图片
注意点
构造方法中所处的线程环境为调用者方的环境,不是自己的环境。
ThreadLocal的使用_第2张图片
运行结果如下
ThreadLocal的使用_第3张图片

关于InheritableThreadLocal

会拷贝一份所处环境中InheritableThreadLocal的值
注意是拷贝,不是共用一个ThreadLocal

/**
 * InheritableThreadLocal:会拷贝一份所处环境中InheritableThreadLocal的值
 * 注意是拷贝
 * @author wcong
 * @version 1.0
 * @date 2020-08-06 16:50
 */
public class ThreadLocalInxxxTest03 {
//    默认泛型为Object
    private static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<Integer>(){
    @Override
    protected Integer initialValue() {
//        初始值
        return 100;
    }
};

    public static void main(String[] args) throws InterruptedException {
        threadLocal.set(520);
        System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get());

        Thread t1 = new Thread(() -> {
//            会拷贝一份所处环境中InheritableThreadLocal的值
                System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get());
                threadLocal.set(1314);
                System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get());
            });
        t1.start();
//        保证子线程先执行完
        t1.join();
        System.out.println(Thread.currentThread().getName() + " --->" + threadLocal.get());
    }
}

运行结果如下
ThreadLocal的使用_第4张图片

你可能感兴趣的:(java并发编程)