京东一面:子线程如何获取父线程 ThreadLocal 的值?我蒙了。。。

Posted Java技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东一面:子线程如何获取父线程 ThreadLocal 的值?我蒙了。。。相关的知识,希望对你有一定的参考价值。

来源:blog.csdn.net/weixin_44912855

最近微信群里一个网友分享了他京东一面的过程,我这里分享给大家其中一道面试题。

京东一面」子线程如何获取父线程ThreadLocal的值

子线程如何获取父线程ThreadLocal的值

想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThreadLocal 实现。

测试代码如下:

public static void main(String[] args) throws InterruptedException 
    Thread parentParent = new Thread(() -> 
        ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
        threadLocal.set(1);
        InheritableThreadLocal<Integer> inheritableThreadLocal = new InheritableThreadLocal<>();
        inheritableThreadLocal.set(2);

        new Thread(() -> 
            System.out.println("threadLocal=" + threadLocal.get());
            System.out.println("inheritableThreadLocal=" + inheritableThreadLocal.get());
        ).start();
    , "父线程");
    parentParent.start();

运行结果如下:

子线程获取父线程中 ThreadLocal 中的值

原理如下:

首先我们要知道 Thread类维护了两个ThreadLocalMap

跟进 new Thread() 方法

其构造方法调用了init方法, init方法把inheritThreadLocals值设置为了true

继续跟进。

当inheritThreadLocals的值为true并且其父线程的inheritableThreadLocals不为null时, 把其父线程inheritableThreadLocals 赋值给当前线程的inheritableThreadLocals

这就是子线程可以获取到父线程ThreadLocal值的关键。

继续跟进 看看 InheritableThreadLocal 的get() 方法

get()方法没什么好看的,就是ThreadLocal的get()方法。

注意:InheritableThreadLocal 对ThreadLocal 的getMap()方法进行重写

ThreadLocalMap getMap(Thread t) 
 //获取线程自己的变量threadLocals,并绑定到当前调用线程的成员变量threadLocals上
    return t.threadLocals;


void createMap(Thread t, T firstValue) 
    t.threadLocals = new ThreadLocalMap(this, firstValue);
    //创建给ThreadLocalMap的table属性赋值,并且将firstValue放在数组首位。

createMap方法不仅创建了threadLocals,同时也将要添加的本地变量值添加到了threadLocals中。

InheritableThreadLocal类继承了ThreadLocal类,并重写了childValue、getMap、createMap方法。

其中createMap方法在被调用的时候,创建的是inheritableThreadLocal而不是threadLocals。

同理,getMap方法在当前调用者线程调用get方法的时候返回的也不是threadLocals而是inheritableThreadLocal。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

以上是关于京东一面:子线程如何获取父线程 ThreadLocal 的值?我蒙了。。。的主要内容,如果未能解决你的问题,请参考以下文章

京东一面:说出ThreadLocal的使用场景及使用方式

京东一面:为什么 HashMap 是线程不安全的?

2023届暑期实习京东物流一面

如何重用线程 - pthreads c

父子线程和线程池如何实现threadLocal变量传递

如何在子线程中访问父线程的空间