前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >InheritableThreadLocal源码阅读

InheritableThreadLocal源码阅读

作者头像
春哥大魔王
发布2018-04-17 17:47:58
6160
发布2018-04-17 17:47:58
举报

在进行多线程编程时,我们经常需要线程池子线程和父线程进行ThreadLocal信息传递,实现一些业务处理。

先看一个例子

代码语言:javascript
复制
public class App {    static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();    public static void main(String[] args) {
        threadLocal.set(new Integer(123));

        Thread thread = new SonThread();
        thread.start();

        System.out.println("main = " + threadLocal.get());
    }    static class SonThread extends Thread {
        @Override        public void run() {
            System.out.println("SonThread = " + threadLocal.get());
        }
    }
}

输出结果

代码语言:javascript
复制
main = 123SonThread = null

使用InheritableThreadLocal

代码语言:javascript
复制
static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<Integer>();

输出结果

代码语言:javascript
复制
main = 123SonThread = 123

通过InheritableThreadLocal我们可以实现父子线程之间ThreadLocal信息传递。

查看InheritableThreadLocal源码

重写了getMap和createMap方法。

代码语言:javascript
复制
public class InheritableThreadLocal<T> extends ThreadLocal<T> {    ThreadLocalMap getMap(Thread t) {       return t.inheritableThreadLocals;
    }

    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
  • 属性inheritableThreadLocals为ThreadLocal属性,说明ThreadLocal为父线程和子线程实现了不同的ThreadLocalMap存储。
  • 当我们创建一个新的线程的时候X,X线程就会有 ThreadLocalMap 类型的 inheritableThreadLocals ,因为它是 Thread 类的一个属性。
代码语言:javascript
复制
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
  • 再通过一个 for 循环,不断的把当前线程的这些值复制到我们新创建的线程X 的inheritableThreadLocals 中。就这样,就ok了。
  • 结果就是我们创建的新线程X 的inheritableThreadLocals 变量中已经有了值了。
  • 那么我在新的线程X中调用threadlocal.get() 方法,首先会得到新线程X 的 inheritableThreadLocals,然后,再根据threadlocal.get()中的 threadlocal,就能够得到这个值。
  • 这样就避免了 新线程中得到的 threadlocals 没有东西。之前就是因为没有东西,所以才拿不到值。

所以说 整个 InheritableThreadLocal 的实现原理就是这样的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 春哥talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先看一个例子
  • 输出结果
  • 使用InheritableThreadLocal
  • 输出结果
  • 查看InheritableThreadLocal源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档