美文网首页
TransmittableThreadLocal线程间上下文传递

TransmittableThreadLocal线程间上下文传递

作者: 瑜骐 | 来源:发表于2019-08-22 16:20 被阅读0次

背景

在项目开发的过程中,难免需要线程之间进行值传递问题;对于这样的问题首先想到的肯定是JDKInheritableThreadLocal类可以完成父线程到子线程的值传递。但对于使用线程池等会池化复用线程的组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的ThreadLocal值传递已经没有意义,应用需要的实际上是把 任务提交给线程池时ThreadLocal值传递到 任务执行时。对于这种情况就想到使用阿里巴巴提供的Transmittable ThreadLocal(TTL)库,库的使用介绍参见https://github.com/alibaba/transmittable-thread-local

场景说明

场景时序图说明

创建了一个数据权限框架,这个框架根据线程上下文ThreadLocal中的对应的队列中是否含义注解和对应的自定义数据权限控制注解的内容,进行数据权限过滤

踩到坑

在上图中步骤4中放入到ThreadLocal中的内容,希望在进行数据权限控制的时候能够用到,且在步骤9中放入ThreadLocal中的数据权限自定义注解不要影响前面调度任务对应的数据权限控制;实际上由于调度任务采用的线程池,而且对应的ThreadLocal采用的是Transmittable ThreadLocal,但是使用的Transmittable ThreadLocal对应的默认copy方法(默认copy方法时浅拷贝),再加上我们的对应的ThreadLocal变量类型的Deque,所以出现了在步骤9中放入的数据权限自定义注解会影响前面步骤对应的数据权限控制;所以通过查看文档,可以通过重新Transmittable ThreadLocal对应的copy方法来实现,通过重写copy方法将浅拷贝重写为深度拷贝就可以解决这个问题:子线程依赖父线程ThreadLocal中的内容,但是子线程ThreadLocal的修改不会反过来影响父线程的ThreadLocal

参考

https://github.com/alibaba/transmittable-thread-local

相关文章

  • TransmittableThreadLocal线程间上下文传递

    背景 在项目开发的过程中,难免需要线程之间进行值传递问题;对于这样的问题首先想到的肯定是JDK的Inheritab...

  • TransmittableThreadLocal线程间传递逻辑

    上一篇文章我们知道了TTL利用了InheritableThreadLocal线程传递的特性进行扩展,也可以在使用线...

  • ThreadLocal作用以及内存泄漏

    一. ThreadLocal作用 存储单个线程上下文信息使变量线程安全减少参数传递 二. ThreadLocal实...

  • 线程本地变量及传递ThreadLocal,Inheritable

    在实际开发中,我们经常需要传递一些上下文变量,有些是线程独立的,有些可能需要传递到子线程,甚至是线程池中,比如,分...

  • TransmittableThreadLocal详解

    1、简介 TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓...

  • Flink通信机制

    flink内部通信机制 Operator间的数据传递本地线程数据传递远程线程数据传递同一线程的Operator数据...

  • Handler详解

    Handler详解 举例 线程间传递数据(主线程跟子线程、两个子线程) 简介 一套android消息传递机制。在多...

  • 多线程篇-TransmittableThreadLocal解决池

    前言 在上一篇文章 多线程篇-父子线程的上下文传递 的文末,我们了解到JDK提供的InheritableThre...

  • gcd线程间通信

    zi线程间通信就是主线程--->子线程,或者从子线程--->主线程之间的信息传递

  • 2.Java内存模型

    1.java并发编程的线程间通信及线程间如何同步线程间通信分为:共享内存,消息传递。线程间同步:共享内存是代码指定...

网友评论

      本文标题:TransmittableThreadLocal线程间上下文传递

      本文链接:https://www.haomeiwen.com/subject/zdnnsctx.html