点击上方“芋道源码”,选择“设为星标”
管她前浪,还是后浪?
能浪的浪,才是好浪!
每天 10:33 更新文章,每天掉亿点点头发...
源码精品专栏
- 原创 | Java 2021 超神之路,很肝~
- 中文详细注释的开源项目
- RPC 框架 Dubbo 源码解析
- 网络应用框架 Netty 源码解析
- 消息中间件 RocketMQ 源码解析
- 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
- 作业调度中间件 Elastic-Job 源码解析
- 分布式事务中间件 TCC-Transaction 源码解析
- Eureka 和 Hystrix 源码解析
- Java 并发源码
来源:blog.csdn.net/
weixin_44912855
- 子线程如何获取父线程ThreadLocal的值
最近微信群里一个网友分享了他京东一面的过程,我这里分享给大家其中一道面试题。
京东一面」子线程如何获取父线程ThreadLocal的值
子线程如何获取父线程ThreadLocal的值
想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThreadLocal 实现。
测试代码如下:
代码语言:javascript复制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()方法进行重写
代码语言:javascript复制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。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
代码语言:javascript复制文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)