继上篇文章《源码 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支持更复杂的线程变量互享场景。