### 使用方式/环境信息: - jdk 1.8 - 未使用TTL agent - 需要依赖lombok、ttl - 仅使用了CompltetableFuture 和 ttl ### 源码  [CompletableFutureTest2.zip](https://github.com/alibaba/transmittable-thread-local/files/6621634/CompletableFutureTest2.zip) ### 问题说明: 看日志跨线程怎么还是拿到了数据?
Activity
oldratlee commentedon Jun 14, 2021
直接原因说明
原因是:
TransmittableThreadLocal
本身也是InheritableThreadLocal
,有Inheritable
能力:可以在新建线程时,传递父子线程的
ThreadLocal
值。对于上面代码运行例子的具体说明如下:
check
操作的线程(上面运行对应test-business-4
)由cache
线程(上面运行对应test-business-1
)创建的。#
Executors.newFixedThreadPool
的ThreadPoolExecutor
的线程创建是Lazy
的。基于
Inheritable
能力做上下文传递是Bug
因为
Inheritable
能力只有在新建线程时,才会传递ThreadLocal
值,所以上面传递的能力是有
Bug
的。Bug
的场景 说明如下:ThreadLocal
值,传递失效Inheritable
过来的线程,串号了。可以通过大量提交任务(实际线上运行的业务逻辑 会持续提交任务),
就可以发现上面 失效/串号 的
Bug
了。上面的
Bug
其实就是为什么需要有TransmittableThreadLocal
这个加强实现的一个原因。更多说明 可以参见文档:
TTL
的用户文档TTL
的好处与必要性确认是由
Inheritable
能力引起的验证实验为了确认上面问题的判断,可以做下面的实验: @biuabiu
100ms
)。用于扩充线程。transmittableThreadLocalOfObject.remove
。避免Inheritable
能力的影响。Executors.newFixedThreadPool
的ThreadPoolExecutor
你实验验证一下,如有问题欢迎继续讨论。 @biuabiu
没说明清楚的地方,也欢迎继续讨论。😄
PS
TTL提供了 关闭
Inheritable
能力的解法:(可能要理解一下 这个解法及其背景原因,有些复杂性。 😄 )
TransmittableThreadLocal
主类的javadoc
说明:https://alibaba.github.io/transmittable-thread-local/apidocs/2.13.0-Beta1/com/alibaba/ttl/TransmittableThreadLocal.html
https://alibaba.github.io/transmittable-thread-local/apidocs/2.13.0-Beta1/com/alibaba/ttl/threadpool/DisableInheritableThreadFactory.html
这个Issue中解释了 为什么要做关闭
Inheritable
能力的原因