本文讲解ThreadLocal、InheritableThreadLocal与TransmittableThreadLocal。
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
在Java的并发编程领域中,ThreadLocal被广泛运用来解决线程安全困境,它巧妙地为每个线程提供独立的变量副本,有效规避了线程间数据共享的问题。
TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用。
ThreadLocal类顾名思义可以理解为线程本地变量。也就是说如果定义了一个ThreadLocal, 每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。它提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制。
在全链路跟踪框架中,Trace信息的传递功能是基于ThreadLocal的。但实际业务中可能会使用异步调用,这样就会丢失Trace信息,破坏了链路的完整性。
前面在介绍分布式链路追踪时讲过异步调用会丢失链路信息,最终的解决方案是使用对应的包装类重新包装一下,如下:
在《【JUC基础】14. ThreadLocal》一文中,介绍了ThreadLocal主要是用于每个线程持有的独立变量。通俗的说就是ThreadLocal是每个线程独有的一份内存,且各个线程间是独立、隔离的。但是随之而来的便会带来如下问题:
这是 JavaGuide 的「优质开源项目推荐」第 11 期,每一期我都会精选 5 个高质量的 Java 开源项目。
在做分布式链路追踪系统的时候,需要解决异步调用透传上下文的需求,特别是传递traceId,本文就线程池透传几种方式进行分析。
ThreadLocal是和当前线程绑定在一起的,就是在一开始的设置一个值,然后在后面可以获得这个值。
AOP 的核心思想是将程序中的不同关注点分离出来,然后通过将这些关注点独立编写代码来实现。这些关注点可以是与程序功能无关的东西,如日志记录、安全检查、事务管理等。通过将这些关注点分离出来,可以使程序更加灵活,易于维护。
本文介绍两种动态切换数据库的方法。 方法一:数据源信息配置在xml中,适用于一般数据库切换。执行完某操作,切换数据库,执行另一个操作。 方法二:数据源信息配置在默认数据源中,适用于切换数据库操作同一方法,相当于批量执行方法。
线程本地存储也是解决特定场景下线程安全问题的思路之一(每个线程都访问本线程自己的变量)。
在我们日常的并发编程中,有一种神奇的机制在静悄悄地为我们解决着各种看似棘手的问题,它就是「ThreadLocal」。
ThreadLocal作为实现“线程封闭”的最主要的编程手段,经常被使用。比如,比如,传统的SimpleDateFormat,不是线程安全的。如果你声明成全局变量,在并发环境下就会产生时间错乱。一种好的解决方式,就是使用ThreadLocal。
1 . 前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 中调用 Java 方法 ;
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Dubbo 框架下 日志链路追踪ID 的实现方案选型思路。
在处理多线程并发安全的方法中,最常用的方法,就是使用锁,通过锁来控制多个不同线程对临界区的访问。
答:AOP(Aspect-Oriented Programming),即面向切面编程。
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。
在企业级业务系统日趋复杂的背景下,微服务架构逐渐成为了许多中大型企业的标配,它将庞大的单体应用拆分成多个子系统和公共的组件单元。这一理念带来了许多好处:复杂系统的拆分简化与隔离、公共模块的重用性提升与更合理的资源分配、大大提升了系统变更迭代的速度、更灵活的可扩展性以及在云计算中的适用性,等等。
作为猫头虎博主,我将为您详细介绍Spring AOP的使用,探索如何利用这一强大的面向切面编程技术来改善您的Java应用程序。本文将从基本概念开始,深入探讨AOP的实际应用,帮助您更好地理解和应用这一关键技术,提高代码的可维护性和可扩展性。
今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工作毫无问题,但现在即便你是应届生,问的考题也非常的深入和细节了,只会背八股,没有一定的代码量和项目积累,根本找不到像样的工作,具体聊天内容如下:
在企业级服务中,经常面临多个业务类中需要完成一些相同的事情,如日志记录、异常处理、事物管理、安全管理等,这些多个业务类共同关注的点也叫横切关注点( cross-cutting concern )。如果在每个业务类中都加上这些横切关注点逻辑,不仅工作量会很大,而且容易产生冗余代码。这时候为解决横切关注点的面向切面编程(AOP)应运而生,AOP 补充了面向对象编程(OOP)。OOP 中模块化的关键单元是类,而在 AOP 中模块化的单元是切面。切面支持跨多个类型和对象的关注点(例如事务管理)。
先介绍一下多数公司采用的方式:目前比较流行的是采用springcloud(或者dubbo)做微服务,按照业拆分为多个独立的服务,服务采用集群的方式部署在不同的机器上,当一个请求过来的时候,可能会调用到很多服务进行处理,springcloud一般采用logback(或者log4j)输出日志到文件中。当系统出问题的时候,按照系统故障的严重程度,严重的会回退版本,然后排查bug,轻的,找运维去线上拉日志,然后排查问题。
子线程的消亡与父线程的消亡并没有任何关系,不会因为父线程的结束而导致子线程退出(操作系统中如此)。
说起本地线程变量,我相信大家首先会想到的是JDK默认提供的ThreadLocal,用来存储在整个调用链中都需要访问的数据,并且是线程安全的。由于本文的写作背景是笔者需要在公司落地全链路压测平台,一个基本并核心的功能需求是压测标记需要在整个调用链中进行传递,线程上下文环境成为解决这个问题最合适的技术。
上一篇我们基本了解了ThreadLocal的大致过程,也就是Thread的局部变量ThreadLocalMap的相关操作。但是在Thread类中我们看到inheritableThreadLocals变量。而且类型与上期说的ThreadLcoalMap一样。按理说说定义一个ThreadLocalMap就可以,这里为什么要定义两个?
我们在学习操作系统课程的时候,应该都学过fork的概念。fork是一个系统调用,用于将当前进程/线程分裂成完全相同的两个。
在 TTL 之前, 先谈谈 JDK 自带的 InheritableThreadLocal
日志作为码农的铁杆儿基友,伴随着码农的一生, 特别是在生死关头 , 能拯救码农于水火 ;但是混乱的日志 , 有时候不仅不能协助解决问题 , 反而还会在那种紧张的氛围下让人变的更焦躁 , 毕竟涉及到看日志的时候 , 多半就是出现bug或者出现异常的情况 , 在一个火烧脚背的环境下 , 不能快速找到我们想要的日志 , 那么解决问题的效率将大大下降 ;
每个线程内部都有一个ThreadLocalMap,每个ThreadLocalMap里面都有一个Entry[]数组,Entry对象由ThreadLocal和数据组成。
在看完《Java多线程编程核心技术》与《Java并发编程的艺术》之后,对于多线程的理解到了新的境界. 先拿如下的题目试试手把.
我们知道ThreadLocal可以实现线程级别下的数据隔离,但是如果需要将当前线程的值传递给子线程,是需要自己去写逻辑实现的,会比较复杂。而InheritableThreadLocal帮助我们解决了这个问题。本篇文章就和大家一起聊聊InheritableThreadLocal。
代码@3:如果线程对象的threadLocals属性不为空,则从该Map结构中,用threadLocal对象为键去查找值,如果能找到,则返回其value值,否则执行代码@4。
老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题:
介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念、原理。在讲解之前我们先列举有关ThreadLocal的几个关键点。
助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)
ThreadLocal在日常工作中的使用频率还是很高的,但是大多使用场景比较单一,而且使用不当的情况下,会出现内存泄露的情况。
SpringBoot是一个非常流行的Java开发框架,它提供了丰富的功能和组件来简化开发工作。其中AOP(Aspect-Oriented Programming)是Spring框架的一个重要特性,它可以帮助我们实现日志记录、性能监控、事务管理等功能。本文将介绍如何在SpringBoot中使用AOP,并通过一个例子详细说明其用法。
ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以通过ThreadLocal对象查询到绑定在这个线程上的一个值。
线程池的线程上下文传递,实现方案就是在提交任务时记录当前线程上下文信息,在线程池中线程执行用户任务前将之前保存的上下文塞到当前线程的上下文中,在执行用户任务之后移除该上下文即可。简单来说就是,外部线程提交任务时要记录上下文信息,内部线程执行任务时获取之前记录的上下文信息设置到当前线程上下文中。
在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 在JDK5.0以后,ThreadLocal已经支持泛型,ThreadLocal类的类名变为ThreadLocal<T>。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。
通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLocal和InheritableThreadLocal有什么区别呢与联系呢?为什么有了ThreadLocal类还需要InheritableThreadLocal类,他们与Thread类是什么关系?带着这些问题我们来分析他们的源码。
领取专属 10元无门槛券
手把手带您无忧上云