源码 InheritableThreadLocal(作用域扩散)

2020-04-26  本文已影响0人  sha4yu0119

继上篇文章《源码 ThreadLocal (线程私有变量)》后,我们明白了ThreadLocal是如何实现线程私有化变量。我们来看下 InheritableThreadLocal 是如何实现在父子线程内传递的。

父子线程这里是指当前线程以及在当前线程中创建的所有线程具有父子关系。当前线程与创建当前线程的线程具有父子关系。

InheritableThreadLocal 其实只复写了 childValue getMap createMap 三个方法。将ThreadLocal 中实际操作的数据结构由 Thread.threadLocals 变成了 Thread.inheritableThreadLocals

而该成员在 Thread::init 方法中被传递给子线程,关键代码如下

private void init (ThreadGroup g, Runnable target, String name,
                      long stackSize, AccessControlContext acc,
                      boolean inheritThreadLocals) {
    ...code...
    if (inheritThreadLocals && parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
    ...code...
}

简单扩展

阿里的开源工具# transmittable-thread-local支持更复杂的线程变量互享场景。

上一篇下一篇

猜你喜欢

热点阅读