TransmittableThreadLocal线程间上下文传递

2019-08-22  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读