ThreadLocal MDC】的更多相关文章

因为MDC底层是用ThreadLocal实现的,所以这里补充一些和ThreadLocal相关的知识点. 1.ThreadLocal的三个层次 关于ThreadLocal有三个层次,可以按照这三个层次去理解就不会乱. 三个层次 * 第一层是Thread空间,通过Thread.currentThread()获得. * 第二层是Thread中的两个ThreadLocalMap,threadLocals和inheritableThreadLocals,访问thread对应的两个ThreadLocalMa…
TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.也是Internet国际互联网络的基础. 我上大学的时候就是一门必修课.工作后我还专门重新看了一遍,觉得比上学时理解的多了些.但是书本上东西毕竟不贴合工作.本文结合工作中常用的方面以及现实中出现过的线上问题来讲解说明. TCP/IP协议栈为什么是"栈"? 大学的时候课本上讲过:开放系统互…
slf4j MDC使用 最近也是在项目代码里发现一个地方有个MDC.put(),忍不住好奇点了进去,于是知道了MDC这个东西,细研究一下,发现还真是个好东西. MDC解决了什么问题 MDC全名Mapped Diagnostic Contexts,是slf4j提供的一个API,主要功能就是在多线程环境下进行日志调用链路的跟踪,比如在一次事务处理中,会经过多个处理的流程,为了定位问题方便,在每个流程中免不了打印一些日志信息.在线上环境中,最后打出来的日志是很多的,如何定位哪些信息是在同一个线程中打印…
前言 如今,在 Java 开发中,日志的打印输出是必不可少的, 关于  有了日志之后,我们就可以追踪各种线上问题.但是,在分布式系统中,各种无关日志穿行其中,导致我们可能无法直接定位整个操作流程.因此,我们可能需要对一个用户的操作流程进行归类标记,比如使用 因此,这就有了  Slf4j MDC 介绍 MDC ( Mapped Diagnostic Contexts ),顾名思义,其目的是为了便于我们诊断线上问题而出现的方法工具类.虽然,Slf4j 是用来适配其他的日志具体实现包的,但是针对 MD…
logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统 logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布式系统的跟踪系统实现的方法. logback设计的一个目标之中的一个是对分布式应用系统的审计和调试.现实世界的分布式系统须要同一时候处理非常多client的请求. 在这样一个典型的多线程应用系统,不同的线程处理不同的client请求. 那我们怎样跟踪这些请求呢.目地想要知道请求响应的时间.请求成功与…
目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3.2.重要方法分析 3.3.set(T): void 3.4.get():T 3.5.remove():void 3.6.总结 1.应用场景及作用 -1作用.ThreadLocal 为了实现线程之间数据隔离,每个线程中有独立的变量副本,操作互不干扰.区别于线程同步中,同步在为了保证正确使用同一个共享变…
springcloud微服务中, 服务间传输全局类参数,如session信息等. 一.问题背景 Hystrix有2个隔离策略:THREAD以及SEMAPHORE,当隔离策略为 THREAD 时,是没办法拿到 ThreadLocal 中的值的. Hystrix提供了基于信号量和线程两种隔离模式,通过在Hystrix基础章节中已经验证过,通过@HystrixCommand注解的方法体将在新的线程中执行,这样会带来些什么意想不到的意外呢,先来看一个示例:1.定义一个webapi,通过RequestCo…
log4j中的%x ---NDC,%X---MDC 即%x NDC.clear();NDC.push(this.toString());%X{first} %X{last}MDC.put("first", "Dorothy"); Logger logger = LoggerFactory.getLogger(SimpleMDC.class); // We now put the last name MDC.put("last", "Pa…
近期用到阿里的一款开源的数据同步工具 Canal,不经意之中看到了 MDC 的用法,而且平时项目中也多次用到 MDC,趁机科普一把. 通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a)MDC 快速入门: b)MDC 源码解读: c)MDC 能干什么? 阿里开源项目 Canal: 老项目这么用过: 但是无论怎么用,都逃不过 MDC API 的使用,下面先花一分钟快速入门,然后再逐步去深入 MDC. 1. MDC 快速入门 MDC 全称是 Mapped Diagnostic Cont…
ThreadLocal 是一个老生常谈的问题,在源码学习以及实际项目研发中,往往都能见到它的踪影,用途比较广泛,所以有必要深入一番. 敢问,ThreadLocal 都用到了哪里?有没有运用它去解决过业务问题呢? 没用过.答不上来也没关系,因为通过今天的分享,能让你轻松 get 如下几点,收获满满. a)ThreadLocal 快速入门: b)ThreadLocal 源码解读: c)ThreadLocal 使用场景: d)ThreadLocal 阿里规约中的奇技淫巧. 1. ThreadLocal…
NDC ( Nested Diagnostic Context )和 MDC ( Mapped Diagnostic Context )是 log4j 种非常有用的两个类,它们用于存储应用程序的上下文信息( context infomation ),从而便于在 log 中使用这些上下文信息. NDC的实现是用hashtable来存储每个线程的stack信息,这个stack是每个线程可以设置当前线程的request的相关信息,然后当前线 程在处理过程中只要在log4j配置打印出%x的信息,那么当前…
前言 Ym8V9H.png (高清无损原图.pdf关注公众号后回复 ThreadLocal 获取,文末有公众号链接) 前几天写了一篇AQS相关的文章:我画了35张图就是为了让你深入 AQS,反响不错,还上了博客园首页编辑推荐,有生之年系列呀,哈哈. image.png 这次趁热打铁再写一篇ThreadLocal的文章,同样是深入原理,图文并茂. 全文共10000+字,31张图,这篇文章同样耗费了不少的时间和精力才创作完成,原创不易,请大家点点关注+在看,感谢. 对于ThreadLocal,大家的…
大家好久不见,我是walking.今天给大家带来一个日志方面的知识——MDC,不知道大家认识不,反正我是最近刚知道的 初见MDC 前两天看项目中的代码,无意中看到一个自定义的线程池 MDCThreadExecutor extends ThreadPoolTaskExecutor 主要针对spring-context 中的 ThreadPoolTaskExecutor 线程池进行了扩展,但也没做多少扩展,仅仅是引入了两个属性,如下: private Map<String, String> thr…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 说到底,你真的会造火箭吗? 常说面试造火箭,入职拧螺丝.但你真的有造火箭的本事吗,大部分都是不敢承认自己的知识盲区和技术瓶颈以及经验不足的自嘲. 面试时: 我希望你懂数据结构,因为这样的你在使用HashMap.ArrayList.LinkedList,更加得心应手. 我希望你懂散列算法,因为这样的你在设计路由时,会有很多选择:除法散列法.平方散列法.斐波那契(Fibonacci)散…
前言 平时并发编程,除了维护修改共享变量的场景,有时我们也需要为每一个线程设置一个私有的变量,进行线程隔离,java提供的ThreadLocal可以帮助我们实现,而讲到ThreadLocal则不得不讲讲java的四种引用,不同的引用类型在GC时表现是不一样的,引用类型Reference有助于我们了解如何快速回收某些对象的内存或对实例的GC控制 四种引用类型在JVM的生命周期 引用队列(ReferenceQueue) ThreadLocal的实现原理和使用 FinalReference和final…
在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 dubbo 分布式系统中,由于 tranID 底层存储在 ThreadLocal 中,由于应用分布在不同的机器中,无法跨应用共享,同一链路多个应用之间的 tranID 不一致,出现线上问题时,日志的排查就尤为棘手. 先说结论:dubbo 分布式应用也可使用MDC进行分布式日志追踪,但是需要配合dubbo…
背景 我们项目中现有日志系统,采用的是slf4j+logback这套日志组件,也是Java生态里面比较常用的一个日志组件,但是随着分布式的演进,这套组件明显存在以下几个问题: 1.各种无关日志穿行其中,导致我们可能无法直接定位整个操作流程.因此,我们可能需要对一个用户的操作流程进行归类标记,既在其日志信息上添加一个唯一标识,比如使用线程+时间戳,或者用户身份标识等:从大量日志信息中grep出某个用户的操作流程. 2.无法做信息埋点,也就不方便做后续系统.业务上进行分析 3.日志排查不方便,需要通…
前言 前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣. 所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少. 我把精华浓缩了一下,汇集成了下面11个问题,看看你能顶住第几个? 1. 为什么要用ThreadLocal? 并发编程是一项非常重要的技术,它让我们的程序变得更加高效. 但在并发的场景中,如果有多个线程同时修改公共变量,可能会出现线程安全问题,即该变量最终结果可能出现异常. 为了解决线程安全问题,JDK出现了很多技术手段…
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new ThreadLocal<>(); 印象中在看书的时候见到过ThreadLocal,但突然就想不起它的用处了..心里一惊感觉当时书白看了.于是马上网上查了查.   原来它的意思是线程的本地变量,ThreadLocal更像是一个线程变量访问的工具类.   那为什么要用这种方法呢? 翻看了<Java并发编程实…
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣!查阅了一下资料发现Android最重要的Handler消息机制里面的Looper存储也是采用ThreadLocal,开源框架EventBus存储当前线程下的发送事件队列状态也是采用ThreadLocal,那么为何要使用ThreadLocal呢?ThreadLocal是什么呢?它能解决什么样的问题呢…
slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用日志接口不同. 在使用日志接口时我们一般这么做 Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS"); if(LOG.isDebugEnabled()) { LOG.debug("log debug"); }…
Threadlocal能够为每个线程分配一份单独的副本,使的线程与线程之间能够独立的访问各自副本.Threadlocal 内部维护一个Map,key为线程的名字,value为对应操作的副本. /** * Created by majun on 16/3/23. */ public class ThreadLocalTest { /* Threadlocal为每个线程维护一个单独的副本, 线程之间互不影响 */ private ThreadLocal<Integer> threadLocal =…
ThreadLocal相当于一个Map<Thread, T>,各线程使用自己的线程对象Thread.currentThread()作为键存取数据,但ThreadLocal实际上是一个包装了这个Map,并且线程只能存取自己的数据,不能操作其它线程的数据. T get() set(T) remove() # T initialValue() 代码示例: public static void main(String[] args) { String[] names = new String[]{&q…
1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocalMap 静态内部类维护了一个Entry 数组 private Entry[] table; 查看Entry 源码,它维护了两个属性,ThreadLocal 对象 与一个Object static class Entry extends W…
一.吐槽 ThreadLocal<T>明显是.NET从JAVA中来的一个概念,但是这种设计是否出现了问题. 很明显,在JAVA中threadLocal直接是Thread的成员,当然随着thread这个宿主而存在. 但.NET中对于ThreadLocal<T>的设计明显独立于Thread之外(当然你可以说内部有关联) ,起最终结果是ThreadLocal<T>所产生的对象不会随着线程的终止而释放. 二.问题代码 /* * 由SharpDevelop创建. * 用户: qs…
作用: 当工作于多线程中的对象使用ThreadLocal维护变量时,threadLocal为每个使用该变量的线程分配一个独立的变量副本. 接口方法: protected T initialValue() //初始化数据.延迟调用方法,在线程第一次调用get或set时才执行,并且只执行1次.默认返回null. public T get() //获取当前线程的变量 public void set(T value) //设置当前线程的变量 public void remove() //删除当前线程的变…
JDK中有一个ThreadLocal类,使用很方便,但是却很容易出现问题.究其原因, 就是对ThreadLocal理解不到位.最近项目中,出现了内存泄漏的问题.其中就有同事在使用ThreadLocal时,没有用好.所以特写下此文. ThreadLocal的设计 ThreadLocalMap.ThreadLocal说明 使用ThreadLocal后的内存模型 如何正确的使用ThreadLocal 错误的使用ThreadLocal会造成内存泄漏 ThreadLocal设计 ThreadLocal的类…
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任务传递进去,任务执行完毕不终止线程,等待下一个任务 线程池的种类 ExecutorService: 这是个接口,代表尽快执行的线程池,只要有空闲进程,就立即执行 Future<?> submit(Runnable task) 将Runnable对象提交给线程池,线程池有空闲线程时执行任务,返回的F…
ThreadLocal是Java语言提供的用于支持线程局部变量的类.所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量(每个线程一个拷贝).在各个Java web的各种框架中ThreadLocal几乎已经被用烂了,spring中有使用,mybatis中也有使用,hibernate中也有使用,甚至我们写个分页也用ThreadLocal来传递参数......这也从侧面说明了ThreadLocal十分的给力. 从使用者的角度而言,一般我们可以将ThreadLocal看做是一…
一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是threadLocal public class ConnThreadLocal { public static ThreadLocal<String> th = new ThreadLocal<String>(); public void setTh(String value){ th.set(…