InheritableThreadLocal类之如何让子类访问父线程的值?

上一篇提到Thread类中有两个ThreadLocalMap类型的变量,我们已经基本了解了threadLocals的基本使用,显然inheritableThreadLocals应该就可以解决让子类访问父类的问题,hhh

InheritableThreadLocal类

继承自ThreadLocal,提供了一个特性,让子线程可以访问父线程中设置的本地变量。

InheritableThreadLocal重写了creatMap方法,所以在这个类中inheritableThreadLocals代替了threadLocals,所以get和set的都是这个map

那么如何让子线程访问父线程的本地变量呢?

在Thread的创建中构造方法会调用init,其中父线程inheritableThreadLocals不为空的话,会设置子线程的inheritableThreadLocals

    //调用函数设置子线程的inheritableThreadLocals
	static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap) {
     
        //利用父线程的变量作为构造函数创建一个新的ThreadLocalMap变量,然后赋值给子类inheritableThreadLocals
        return new ThreadLocalMap(parentMap);
        //在构造函数中,把父线程的inheritableThreadLocals成员变量的值赋值到新的ThreadLocalMap对象中
    }

总结:InheritableThreadLocal类通过重写,首先把本地变量保存到具体线程的inheritableThreadLocals,在线程通过InheritableThreadLocal类的实例的set或者get方法设置变量,创建当前线程的inheritableThreadLocals变量。父线程创建子线程是,构造函数会把父线程的inheritableThreadLocals变量中的本地变量copy到子线程的inheritableThreadLocals变量中

InheritableThreadLocal类之如何让子类访问父线程的值?_第1张图片

子线程使用父线程threadLocal有多种方式,比如创建线程的时候传入父线程的变量,并将其赋值到子线程,或者在父线程中构造一个map作为参数传递给子线程,这些情况下InheritableThreadLocal就比较有用。
感谢您的观看!!!

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