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

码农突围

共 2001字,需浏览 5分钟

 ·

2022-04-11 17:00

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

来源:blog.csdn.net/weixin_44912855
  • 子线程如何获取父线程ThreadLocal的值

最近微信群里一个网友分享了他京东一面的过程,我这里分享给大家其中一道面试题。
京东一面」子线程如何获取父线程ThreadLocal的值

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

图片
想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThreadLocal 实现。
测试代码如下:
public static void main(String[] args) throws InterruptedException {
    Thread parentParent = new Thread(() -> {
        ThreadLocal threadLocal = new ThreadLocal<>();
        threadLocal.set(1);
        InheritableThreadLocal 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、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF

欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈。

浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报