alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

有必要关闭Inheritable能力么 #531

Closed songxiaosheng closed 1 year ago

songxiaosheng commented 1 year ago

多线程场景存在new Thread的场景,对于这种场景如果关闭Inheritable能力意味着,无法传递数据 ,当前版本的agent并有去处理这种场景,如果不关闭的话所有子线程(包含框架内部的很多线程都会触发clone方法进行无意义的clone), 如果关闭了Inheritable能力该如何在new Thread场景下自动传递,而无需改动现有代码 https://github.com/alibaba/transmittable-thread-local/issues/100 这个Issue中解释了 为什么要做关闭Inheritable能力的原因

oldratlee commented 1 year ago

TTL直接提供了「关闭线程池中线程inheritable能力」的功能: @songxiaosheng getDisableInheritableThreadFactory()

不是关闭所有线程的inheritable能力。 (当然也可实现,见TransmittableThreadLocaljavadoc

非线程池中线程,inheritable能力在业务使用中应该是必要的。

songxiaosheng commented 1 year ago

感谢大佬回复,这个inheritable能力存在时候,主线程使用了ttl的threadlocal时 大量的框架层线程触发的时候也会频繁的触发childValue方法产生大量的垃圾对象,并且拷贝到子线程的数据并不会清理风险较高

songxiaosheng commented 1 year ago

是否考虑后续new Thread场景 通过agent方式修改Runnable类型为TtlRunnable类型

oldratlee commented 1 year ago

有必要关闭Inheritable能力么

由你应用场景、需求决定。 @songxiaosheng

TTL提供了关闭Inheritable的一些方法,具体参见TransmitableThreadLocal的JavaDoc。

如果Inheritable的「泄露」有实际影响,则做关闭操作,当然会有功能上的影响。

oldratlee commented 1 year ago

是否考虑后续new Thread场景 通过agent方式修改Runnable类型为TtlRunnable类型

看起来没有必要。

TTL提供了关闭Inheritable的一些方法,具体参见TransmitableThreadLocal的JavaDoc。