文档章节

ThreadLocal和InheritableThreadLocal解析

追忆100
 追忆100
发布于 2017/09/07 09:49
字数 300
阅读 13
收藏 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不可以

© 著作权归作者所有

共有 人打赏支持
追忆100
粉丝 2
博文 9
码字总数 3297
作品 0
杭州
后端工程师
ThreadLocal和InheritableThreadLocal深入分析

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

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

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

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

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

小勇DW3
08/13
0
0
InheritableThreadLocal详解

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

沈渊
04/12
0
0
子线程使用父线程RequestScope作用域Bean问题的探究

一、前言 最近我们组在做项目分层模块化项目调研,同组通元童鞋在调研ajdk8的多租户方案需要对每一个请求开启一个线程进行处理,然后就产生一个问题如何在开启的线程中不破坏使用习惯情况下使...

加多
06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud SpringBoot mybatis分布式Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用...

itcloud
6分钟前
0
0
c++ std::bind和std::function

定义于头文件 <functional> std::bind 函数绑定,https://zh.cppreference.com/w/cpp/utility/functional/bind // bind 用例#include <iostream>#include <functional> // 自定义的一......

SibylY
8分钟前
0
0
SecureCRT的安装与破解(过程很详细!!!)

SecureCRT的安装与破解(过程很详细!!!) SecureCRT的安装与破解(过程很详细!!!) 使用SecureCRT可以方便用户在windows环境下对linux主机进行管理,这里为大家讲一下SecureCRT的破解方...

DemonsI
13分钟前
0
0
介绍几款可用的web应用防火墙

目前有两款,基于软件和基于应用程序的web应用防火墙。基于软件的产品布置在Web服务器上,而基于应用程序的产品放置在Web服务器和互联网接口之间。两种类型的防火墙都会在数据传入和传出web...

上树的熊
19分钟前
1
0
用Visual Studio开发以太坊智能合约

区块链和以太坊 自从我熟悉区块链、以太坊和智能合约以来,一直失眠。 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议使用以太坊网站官方客户端应用程序(Ethereum Wallet)也...

geek12345
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部