文档章节

ThreadLocal和InheritableThreadLocal解析

追忆100
 追忆100
发布于 2017/09/07 09:49
字数 300
阅读 22
收藏 0

InheritableThreadLocal 扩展了 ThreadLocal,为子线程提供从父线程那里继承的值,在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。

看代码:

package cn.com.mayue.jdk;
import org.junit.Test;

import static java.lang.System.out;

/**
 * Created by mayue on 2017/1/10.
 * log4j的MDC 实现中使用了 InheritableThreadLocalTest
 * 测试 InheritableThreadLocal 的线程的继承
 */
public class InheritableThreadLocalTest {
    /**
     * 测试 ThreadLocal
     */
    @Test
    public void testThreadLocal() {
        final ThreadLocal<String> local = new ThreadLocal<String>();
        exec(local);
    }

    /**
     * 测试 InheritableThreadLocal
     */
    @Test
    public void testInheritableThreadLocal() {
        final ThreadLocal<String> local = new InheritableThreadLocal<String>();
        exec(local);
    }

    private void exec(final ThreadLocal<String> local) {
        local.set("parent thread");
        out.println(Thread.currentThread() + "," + local.get());
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                out.println(Thread.currentThread() + "," + local.get());
                local.set("child thread");
                out.println(Thread.currentThread() + "," + local.get());
            }
        });

        t.start();
        try {
            //把创建的线程 合并到当前的线程中  方便看打印信息  打印信息和代码顺序一致
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        out.println(Thread.currentThread() + "," + local.get());
    }
}

方法testThreadLocal执行结果:

Thread[main,5,main],parent thread
Thread[Thread-0,5,main],null
Thread[Thread-0,5,main],child thread
Thread[main,5,main],parent thread

 

方法testInheritableThreadLocal执行结果:

Thread[main,5,main],parent thread
Thread[Thread-0,5,main],parent thread
Thread[Thread-0,5,main],child thread
Thread[main,5,main],parent thread

 

从执行结果中可以看出,InheritableThreadLocal可以获取父级线程的内容,而ThreadLocal不可以

© 著作权归作者所有

上一篇: joda-time推荐
下一篇: spring 事件(注解)
追忆100
粉丝 2
博文 9
码字总数 3297
作品 0
杭州
后端工程师
私信 提问
ThreadLocal和InheritableThreadLocal深入分析

  通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLocal和InheritableThreadLocal有什么区别呢与联系呢?为什么有了Threa...

良辰美景TT
2018/08/14
0
0
ThreadLocal原理深入解析

1. 从一次项目经历说起 在上家公司做spark的任务调度系统时,碰到过这么一个需求: 1.任务由一个线程执行,同时在执行过程中会创建多个线程执行子任务,子线程在执行子任务时又会创建子线程执行子...

takumiCX
2018/07/16
0
0
ThreadLocal 类 的源码解析以及使用原理

1、原理图说明      首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体,该实体包...

小勇DW3
2018/08/13
0
0
ThreadLocal与InheritableThreadLocal区别

最近项目中为了让打印的日志可以追踪,看到了Logback和log4j2支持的MDC功能,其内部利用了子线程从父线程继承InheritableThreadLocal类型变量的特性。以前只使用到了ThreadLocal,在这里做一...

特拉仔
2018/09/01
437
0
InheritableThreadLocal详解

1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadL...

沈渊
2018/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

记一次项目启动报java.lang.StackOverflowError

项目是spring boot,之前没有问题,突然有一次debug方式启动的时候报这个错误。 因为其他同事没有问题,线上也没有问题,所以先排除了是代码问题。 开始以为电脑开的软件太多,然后给jvm的内存...

chro008
8分钟前
5
0
idea 2019.2免费激活码

亲测有效到2020.6 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb......

Iverson58
15分钟前
3
0
移动APP开发中的重要注意事项

您的移动app在变化吗?如果没有,请确保遵循这些提示进行移动app开发。大多数行业的IT领导者都优先考虑劳动力和消费者的移动性。实现成功的移动app开发具有挑战性,涉及在app功能开发的基础上...

a429011717
22分钟前
5
0
Qt编写自定义控件69-代码行数统计

一、前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行、注释行、代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计。写完这...

飞扬青云
41分钟前
10
0
驰骋工作流引擎-ccflow关于 “ 是否自动计算未来的处理人”的功能变更

关键字:流程未来节点处理人 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 业务背景:一个流程在启动起来后,是可以对一些节点计算出来处理人是谁,流程的走向。对于另...

孟娟
57分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部