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

线程池每次执行完成后默认将上下文还原至调用线程的上下文原状,可以执行完成后将线程中的上下文全部清除掉吗 #488

Closed OrientationZero closed 1 year ago

OrientationZero commented 1 year ago

线程池每次执行完成后默认将上下文还原至调用线程的上下文原状,可以执行完成后将线程中的上下文全部清除掉吗? 因为可能线程池执行任务的频次不高,并且每次调用线程的上下文也都不一样,这样线程池中无用的上下文在下次调用之前会一直在内存中了

oldratlee commented 1 year ago

可以执行完成后将线程中的上下文全部清除掉吗?

可以。Transmitter#clear()方法用于清除所有线程上下文。 @OrientationZero # 严格的说,清理的是TTL管理的所有线程上下文,包含注册给TTLThreadLocal实例。

https://github.com/alibaba/transmittable-thread-local/blob/86342990806ef94280941e31e529597ab775f611/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java#L547-L564

TTL自己的实现逻辑中也有使用,在DisableInheritableThreadFactoryWrapper

https://github.com/alibaba/transmittable-thread-local/blob/86342990806ef94280941e31e529597ab775f611/src/main/java/com/alibaba/ttl/threadpool/DisableInheritableThreadFactoryWrapper.java#L21-L29


因为可能线程池执行任务的频次不高,并且每次调用线程的上下文也都不一样,这样线程池中无用的上下文在下次调用之前会一直在内存中了

这个问题的解决方法是

TTL有讨论 & 提供了相应的功能实现: @OrientationZero


要不要 「默认」执行完成后将线程中的上下文全部清除掉,要看这样做是不是安全合理的。

简单看看,这样的做法不安全;执行完成后恢复上下文(不做全部清除),可以让外层的执行不受内层上下文变化的影响,这样是确定可控。