ThreadLocal系列(三)-TransmittableThreadLocal的使用及原理解析 上一篇:ThreadLocal系列(二)-InheritableThreadLocal的使用及原理解析 一.基本使用 首先,TTL是用来解决ITL解决不了的问题而诞生的,所以TTL一定是支持父线程的本地变量传递给子线程这种基本操作的,ITL也可以做到,但是前面有讲过,ITL在线程池的模式下,就没办法再正确传递了,所以TTL做出的改进就是即便是在线程池模式下,也可以很好的将父线程本地变量传递下去,先…
一.示例 线程池内的线程并没有父子关系,所以不适合InheritableThreadLocal的使用场景 public class ThreadPoolInheritableThreadLocalDemo { // static ThreadLocal<String> threadLocal = new InheritableThreadLocal<>(); // static ExecutorService pool = Executors.newFixedThreadPool(…
上一篇文章中,我们谈到了 InheritableThreadLocal,它解决了 ThreadLocal 针对父子线程无法共享上下文的问题.但我们可能听说过阿里的开源产品TransmittableThreadLocal,那么它又是做什么的呢? 线程池中的共享 我们在多线程中,很少会直接 new 一个线程,更多的可能是利用线程池处理任务,那么利用 InheritableThreadLocal 可以将生成任务线程的上下文传递给执行任务的线程吗?废话不多说,直接上代码测试一下: public clas…
ThreadLocal系列之InheritableThreadLocal的使用及原理解析(源码基于java8) 上一篇:ThreadLocal系列(一)-ThreadLocal的使用及原理解析 下一篇:ThreadLocal系列(三)-TransmittableThreadLocal的使用及原理解析 一.基本使用 我们继续来看之前写的例子: private static ThreadLocal tl = new ThreadLocal<>(); public static void main(…
最近由于需要用到ThreadLocal,在网上搜索了一些相关资料,发现对ThreadLocal经常会有下面几种误解 一.ThreadLocal是java线程的一个实现       ThreadLocal的确是和java线程有关,不过它并不是java线程的一个实现,它只是用来维护本地变量.针对每个线程,提供自己的变量版本,主要是为了避免线程冲突,每个线程维护自己的版本.彼此独立,修改不会影响到对方. 二.ThreadLocal是相对于每个session的 ThreadLocal顾名思义,是针对线程…
当前线程的值传递,ThreadLocal 通过ThreadLocal设值,在线程内可获取,即时获取值时在其它Class或其它Method. public class BasicUsage { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); public static void main(String[] args) { threadLocal.set(1); otherMet…
目录 一.ThreadLocal介绍 二.使用场景1——数据库事务问题 2.1 问题背景 2.2 方案1-修改接口传参 2.3 方案2-使用ThreadLocal 三.使用场景2——日志追踪问题 四.其他使用场景 一.ThreadLocal介绍 我们知道,变量从作用域范围进行分类,可以分为“全局变量”.“局部变量”两种: 1.全局变量(global variable),比如类的静态属性(加static关键字),在类的整个生命周期都有效: 2.局部变量(local variable),比如在一个方…
Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不同线程记录日志(Log)--->负责将日志写入文件的类(TsLog) 二:Thread-Specific Storage模式什么时候使用--->当每个线程必须有自己的独有信息时,可以将该信息放入线程保管箱ThreadLocal 三:Thread-Specific Storage思考--->放…
一.Thread API: setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 首先要了解什么是Thread.UncaughtExceptionHandler,默认来说当线程出现未捕获的异常时,会中断并抛出异常,抛出后的动作只有简单的堆栈输出.如: public class ThreadTest{ public static void main(String[] args) throws Exception…
在某个项目中,需要使用mybatis-plus多租户功能以便数据隔离,前端将租户id传到后端,后端通过拦截器将该租户id设置到ThreadLocal以便后续使用,代码大体上如下所示: ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<>(); threadLocal.set(1); 我在Controller层使用线程池取了租户id,代码大体上如下所示: ExecutorService executorServ…