#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中。