`

MDC实现之ThreadLocal

 
阅读更多
因为MDC底层是用ThreadLocal实现的,所以这里补充一些和ThreadLocal相关的知识点。
1.ThreadLocal的三个层次
关于ThreadLocal有三个层次,可以按照这三个层次去理解就不会乱。
三个层次
* 第一层是Thread空间,通过Thread.currentThread()获得。
* 第二层是Thread中的两个ThreadLocalMap,threadLocals和inheritableThreadLocals,访问thread对应的两个ThreadLocalMap成员变量获得。
* 第三层是每个ThreadLocalMap中key——ThreadLocal和value——ThreadLocal的set方法set的值,在get方法中用ThreadLocal的this作为ThreadLocalMap的key获取value。
* 无论什么操作都要按照这三个层次依次进行才不会乱
2.ThreadLocalMap
保存了当前Thread中存放的ThreadLocal和ThreadLocal对应的值的键值对。
当前线程的所有ThreadLocal变量组成了这个map的keyset,对应的值组成了这个map的valueset。
3.ThreadLocal的操作
第一步都是先用Thread.currentThread()获得当前线程,然后getMap获取线程中的ThreadLocalMap。
像getMap这些操作方法都是包可见性的,包外部无法操作。以ThreadLocal的get方法举例,

/** 
     * Returns the value in the current thread's copy of this 
     * thread-local variable.  If the variable has no value for the 
     * current thread, it is first initialized to the value returned 
     * by an invocation of the {@link #initialValue} method. 
     * 
     * @return the current thread's value of this thread-local 
     */  
    public T get() {  
        Thread t = Thread.currentThread();  
        ThreadLocalMap map = getMap(t);  
        if (map != null) {  
            ThreadLocalMap.Entry e = map.getEntry(this);  
            if (e != null)  
                return (T)e.value;  
        }  
        return setInitialValue();  
    }  


4.InheritableThreadLocal
Thread类中有两个ThreadLocalMap,一个是threadLocals,一个是inheritableThreadLocals。
threadLocals保存的是当前线程中的ThreadLocal变量们,inheritableThreadLocals保存的是当前线程父线程中的变量们。
InheritableThreadLocal类覆写了getMap和createMap这两个方法,

/** 
    * Get the map associated with a ThreadLocal. 
    * 
    * @param t the current thread 
    */  
   ThreadLocalMap getMap(Thread t) {  
      return t.inheritableThreadLocals;  
   }  
[java] view plain copy 在CODE上查看代码片派生到我的代码片
/** 
     * Create the map associated with a ThreadLocal. 
     * 
     * @param t the current thread 
     * @param firstValue value for the initial entry of the table. 
     * @param map the map to store. 
     */  
    void createMap(Thread t, T firstValue) {  
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);  
    }  


可以看出在初始化或者getMap的时候,获取到的都是inheritableThreadLocals引用,操作的也是inheritableThreadLocals这个ThreadLocalMap。
5.threadLocals和inheritableThreadLocals的初始化
/** 
     * Initializes a Thread. 
     * 
     * @param g the Thread group 
     * @param target the object whose run() method gets called 
     * @param name the name of the new Thread 
     * @param stackSize the desired stack size for the new thread, or 
     *        zero to indicate that this parameter is to be ignored. 
     */  
    private void init(ThreadGroup g, Runnable target, String name,  
                      long stackSize) {  
        ...  
        Thread parent = currentThread();  
        ...  
        if (parent.inheritableThreadLocals != null)  
            this.inheritableThreadLocals =  
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);  
        ...  
    }  


在new一个Thread的时候会调用Thread的init方法,该方法中如果parent线程的inheritableThreadLocals不是null的话,就会用createInheritedMap方法,用parent的inheritableThreadLocals中的元素构造一个新的ThreadLocalMap。
注意:该操作只在线程初始化的时候进行,所以在该线程初始化之后,parent线程对parent线程自己的inheritableThreadLocals变量的操作不会影响到当前线程的inheritableThreadLocals了,因为已经不是同一个map了。
MDC就是利用这个InheritableThreadLocal把父线程的context带到子线程中,把上下文传递到子线程中通过日志输出,把一次完整的请求串联起来。
6.parent线程

Thread parent = currentThread(); 


在Thread的init方法中,是通过获得当前线程作为parent线程,也就是说,在哪个线程中new的这个Thread并start的,执行该操作的线程就是new的新Thread的parent线程。
但是init方法只在线程初始化的时候执行一次,所以如果用的线程池来使线程重用的话,就不会再调用这个init方法了,这会带来一些问题,后面会具体说。

参考:http://blog.csdn.net/xxcupid/article/details/51955800
分享到:
评论

相关推荐

    MDC04、MDC02中文手册

    MDC04和MDC02是高集成度的数字模拟混合信号传感集成电路,芯片直接与被测物附近的差分电容极板相连,利用不同物质介电常数的区别,通过放大、数字转换、补偿计算电容的微小变化来实现物质成分的传感。该芯片具有宽...

    MDC-4.rar_mdc_mdc-4 algorithm_mdc-4 c_mdc4 algorit

    在描述中提到的MDC-4算法的C语言实现,通常是将算法的逻辑用C语言编写成源代码文件,供开发者学习和使用。C语言是一种底层编程语言,适合编写系统级和效率要求高的程序,因此它是实现这种基础算法的常见选择。C语言...

    华为MDC平台解决方案汇报.pdf

    详细介绍华为MDC平台解决方案,包括MDC硬件平台、MDC软件平台、MDC工具链、车规和质量,是了解和学习MDC平台的优质资料。

    华为MDC智能驾驶平台示例代码

    示例代码可能涵盖如何按照ADSFI标准设计和实现服务接口,确保系统的可扩展性和互操作性。 5. ASCENDCL_Sample: ASCENDCL是华为自研的深度学习计算库,针对华为昇腾芯片进行了优化。这部分示例可能会涉及如何使用...

    slf4j中的MDC

    例如,可以使用ThreadLocal来实现。 4. **与日志框架结合**: - SLF4J提供了与各种日志实现的适配器,如Logback、Log4j等,因此MDC的功能可以无缝集成到这些日志框架中。 5. **日志拦截器**: - 在微服务或者...

    华为MDC 智能驾驶计算平台.pdf

    华为MDC智能驾驶计算平台是华为技术有限公司推出的面向智能驾驶领域的先进解决方案,其核心概念和应用架构在智能驾驶产业发展中占有重要位置。以下详细介绍华为MDC智能驾驶计算平台相关的核心知识点。 **智能驾驶...

    gpio模拟的mdc mdio驱动代码.rar

    在VxWorks操作系统环境下,由于可能缺乏专门的MDC/MDIO硬件接口,开发者会利用GPIO来实现这些功能。本篇将深入探讨如何使用VxWorks系统中的GPIO来模拟MDC/MDIO驱动。 首先,了解MDC/MDIO协议至关重要。MDC是一个...

    信令MDC1200.mp3

    MOTO MDC1200信令

    mdc.tar.gz_Encryption c#_mdc_mdc-4_mdc加密

    在C#编程环境中,实现MDC加密涉及到多个关键概念和技术。本文将深入探讨MDC加密算法,C#中的实现方式,以及如何处理MDC-4这种特定变体。 MDC,全称为消息摘要密码,它基于哈希函数设计,目的是生成一个固定长度的...

    智能制造之数控系统DNC MDC系统

    智能制造是现代制造业转型升级...通过采用先进的DNC和MDC系统,可以实现对数控机床的集中控制和数据采集,实现生产过程的自动化和智能化,大幅度提高生产效率和产品质量,降低生产成本,最终达到提升企业竞争力的目的。

    MDC.rar_mdc_mdc matlab

    在提供的压缩包文件“MDC.m”中,包含了MATLAB代码实现的MDC算法。代码可能包括上述各个步骤的函数,如数据预处理函数、特征提取函数、MDC模型构建和训练函数以及分类函数。为了理解和使用这段代码,需要具备一定的...

    mdc1200编解码库

    这个编解码库的目的是简化开发人员在实现MDC1200通信协议时的工作,提供高效且可靠的编码和解码功能。 MDC1200技术基于频率键控(FSK)调制原理,通过改变载波频率来表示二进制数据。这种调制方式在嘈杂的环境下仍...

    MDC1200信令解码软件

    MDC1200信令解码软件是一种专门用于处理MDC1200信令技术的专业工具。在无线电通信领域,MDC1200(Motorola Data Communication)是摩托罗拉公司开发的一种数字信令协议,它主要用于增强两台对讲机之间的数据通信能力...

    mdc1200编解码

    `mdc_encode.c` 文件是实现MDC1200编码的源代码,它包含了将原始数据转换为MDC1200格式的过程。编码过程中,每个比特会被转换为特定的波形,以便在无线电频谱上进行传输。这个过程通常包括以下几个步骤: 1. **...

    MDC1200信令专题介

    ### MDC1200信令专题介绍 #### 一、引言 MDC1200信令是摩托罗拉...通过其高效的数据传输能力和丰富的功能集,MDC1200极大地提高了通信系统的整体性能和可靠性,成为摩托罗拉及其他无线电通信系统中的关键技术之一。

    MDC.rar_mdc

    综上所述,"MDC.rar_mdc"中的内容可能涵盖如何设置和管理多数据中心的代码示例,包括数据复制、故障切换、负载均衡等方面的实现。学习并理解这些知识,对于构建高可用、高扩展性的分布式系统至关重要。如果你需要...

    MDC_Manifest_Configurator-Ubuntu18-1.0.101.1.tar.gz

    《智能驾驶:MDC Manifest Configurator在Ubuntu 18上的应用与详解》 在智能驾驶领域,高效、安全的系统配置至关重要。MDC(Mobileye Drive Compute)是英特尔Mobileye公司推出的高性能计算平台,用于自动驾驶车辆...

    mdc.zip_MDC MDIO_MDIO vhdl_mdio_mdio mdc

    在本项目中,重点是实现MDC主机时钟的整形,以产生具有50%占空比的时钟方波,这是MDIO通信协议的基本要求之一。 MDIO协议规定了通信的时序,其中MDC提供了一个固定频率的时钟信号,用于同步MDIO数据线上的数据传输...

    MDIO-MDC(SMI)接口.pdf

    通过MDIO-MDC接口,可以实现以下功能: - 配置PHY的参数。 - 读取PHY的状态信息,如链路状态、错误计数等。 - 实现对PHY的诊断和调试。 #### 三、MDIO-MDC(SMI)接口的基本组成 MDIO-MDC接口由以下两个主要部分组成...

    mdio_mdc.zip_MDIO vhdl_mdc_mdio_mdio verilog_mdio_mdc

    在 FPGA(Field-Programmable Gate Array)或 ASIC(Application-Specific Integrated Circuit)设计中,MDIO 和 MDC 的实现通常用到 VHDL 或 Verilog 这两种硬件描述语言。"mdio_mdc.zip" 包含的 "mdio_mdc.v" 文件...

Global site tag (gtag.js) - Google Analytics