InheritableThreadLocal一探究竟

直接上代码


public class MyThread {

    public static void main(String[] args) {
        new Thread(new T()).start();
        while (true){}
    }

    static class T extends Thread{

        @Override
        public void run() {
            // 可继承的父线程的ThreadLocal, 子类需要获取到改引用,才能使用
            InheritableThreadLocal<Map> pInheritableThreadLocal = new InheritableThreadLocal<>();
            Map<String,String> map = new HashMap<>();
            map.put("a","a");
            pInheritableThreadLocal.set(map);

            new Thread(()->{
                while (true){
                    beginSleep(2 * 1000);
                    // 子线程的 Map
                    InheritableThreadLocal<Map> sInheritableThreadLocal = new InheritableThreadLocal();

                    // 从父类的 Map拿数据。其实是子类自己的ThreadLocal
                    // 只不过 父类 和 子类 共享 父类的 Map,并且都可以改变其值
                    Map pMap = pInheritableThreadLocal.get();
                    // 从自己的Map拿数据
                    Map sMap = sInheritableThreadLocal.get();

                    // 拿到 父线程Map里的数据
                    System.out.println("pMap:" + pMap);
                    System.out.println("sMap:" + sMap);
                }
            },"sub-t").start();

            beginSleep(7 * 1000);

            map.put("b","b"); // 继续加值
            System.gc();
        }
    }

    static void beginSleep(long millis){
        try {
            Thread.sleep(millis);
        }catch (Exception e){

        }
    }
}

为什么 子类 可以 跟父类 共享 父类的 InheritableThreadLocal 中的 数据?

其实很简单。

就是创建线程的时候的一段逻辑,这个逻辑就是从父类的 InheritableThreadLocal 获取到值 赋值给 子类的 InheritableThreadLocal。

 if (inheritThreadLocals && parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值