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

点击上方“码农突围”,马上关注

 
 
这里是码农充电第一站,回复“666”,获取一份专属大礼包
真爱,请设置“星标”或点个“在看”

90c470f986b76fc282c3e19166a47980.png

来源:blog.csdn.net/weixin_44912855

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


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

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

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

7c46c90e75d7271e25fbfc31ff7b1805.png

图片

想要子线程获取父线程中 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();
}

运行结果如下:

57a3cdcc07eb6d9f3c39614cddcd4f1d.png子线程获取父线程中 ThreadLocal 中的值

原理如下:

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

54d4334123af2f7b06ac35d56f6f601f.png

图片

跟进 new Thread() 方法

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

b7369c6229b62bb44b8a3cc314888618.png

图片

继续跟进。

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

0de9b21c2df27770339e6c8743c5fd33.png

图片

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

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

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

1a043d4fc30d3620642b439a138a15f7.png

图片

注意: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、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF

欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值