ThreadLocal父子线程传递数据问题

#ThreadLocal简介

ThreadLocal大家应该都比较熟悉,ThreadLocal可以将一个数据和本地线程绑在一起。
ThreadLocal中,有一个静态内部类ThreadLocalMap。该map的key就是当前线程的引用(tip:这里的引用是weakReference,因此,当ThreadLocal实例被回收时,强引用/实例所指向的map的key也就被回收)。也就是一个线程一个Map。但是只要线程还活着,这个map的value就存在,因此,如果线程能自行销毁的情况下,不必关注ThreadLocal的内存泄漏问题,但一般情况下,为了避免内存泄漏,使用完后一定要remove掉。
ThreadLocal实际存储数据的地方在这个Map。

ThreadLocal父子线程间传递数据怎么做?

最近看到好几个公众号发了类似的文章,想着很久没写博客了,正好看下源码研究下。
一般场景中,想要使用ThreadLocal实现父子线程传递数据的需求极少,但本着刨根问底的学术思想,简单研究下源码。
在Thread类中,有一个ThreadLocal变量inheritableThreadLocals。也可以通过threadLocal类中的方法进入,ThreadLocal中的createMap方法只有InheritableThreadLocal类继承了。
Thread类中的inheritableThreadLocals变量在这里插入图片描述这里的注释表示为:使用inheritableThreadLocals后,保存的数据就不在原来的ThreadLocals中,而是在一个新的inheritableThreadLocals变量中。
并且我们可以在ThreadLocal的继承类中找到这个类:

在这里插入图片描述
该类的注解(英语不好靠翻译哈哈):
在这里插入图片描述

因此,想要做到父子线程间的数据传递,可以替换为这个类。
那么,这里又是如何做到数据传递的呢?
首先看一下Thread中的init方法:
在这里插入图片描述

这个方法的末尾部分出现了inheritThreadLocals:
在这里插入图片描述

这里的代码已经说的很清楚了,如果设置了inheritThreadLocals变量,那么调用ThreadLocal的createInheritedMap方法。

在这里插入图片描述
我们再深入看下这个拷贝的方法:

在这里插入图片描述
看得出来,这个方法没有什么特别之处,就是一个浅拷贝,将一个Map的数据拷贝到另一个Map中。这个方法很明显就是个拷贝的方法,返回一个新的map。因此,这里的init方法其实就是将父线程的threadlocals中的所有数据拷贝到一个新的inheritThreadLocals中。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值