-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用方式:SpringBoot启动时,调用TTL的get方法如何保证线程安全 #282
Comments
解决
|
您好。我明白可以装饰ThreadFactory来解决ITL的问题。 但是我重点强调的是: 请求进来时,是tomcat开启一个线程处理; |
如果只希望在
PS:
|
好的,我理解您的意思了 |
👍 👏 🎉 @yexuerui 带上 并发/多线程 维度时,要想解释清楚,是比较费时费力的~ 🤣 🤯 之前的Issue,涉及并发多线程时, |
public static final TransmittableThreadLocal<ConcurrentMap<String, Object>> THREAD_CONTEXT = TransmittableThreadLocal.withInitial(() -> {
return new ConcurrentHashMap<>();
}); @oldratlee 你好,
但是依然存在线程安全问题。 问题表现为,
尝试过 问题是否跟 由于业务相对复杂,但是我尝试用测试用例复现,却没能复现出来 😭 , |
@HuangDayu 独立的问题,请开个新的 issue。 🙏 上面你列的这些前提,如
并不能保证 在你业务中 取得 你期望的新值或旧值。 『并不能保证』的一个简单举例 就是
如果不能排除『一段在你业务之中你意料之外的逻辑 改写了 @HuangDayu 你可以优先找一下 有没有这样意料之外的改写逻辑。即使在业务代码复杂后找起来不容易。基础件(如 当然确保你正确地理解与使用了这些基础件。 一个复现Demo,因为有全部的运行逻辑代码,可以用于排除或证实
PS: |
@oldratlee 你好,我已参照TtlMDCAdapter 解决了该问题,非常感谢你的解答,谢谢。 |
因为
TTL
底层使用ITL
,会导致在new
线程的时候,父子线程的数据传递,且无法销毁。背景:
TTL
的get
操作,于是main
线程存在TTL
的value
;Tomcat
线程池(不会被TtlExecutors
装饰)会开启子线程来执行业务逻辑;main
线程会将TTL
(此时仅可看做ITL
)的值传递到子线程;TTL
的引用时,会造成内存不安全;代码如下:
疑问:此时由于是普通的线程池,即使
TTL
重写copy
方法也会造成线程不安全;解决方法只有去重写
childValue
方法,来解决ITL
传递到子线程吗?:The text was updated successfully, but these errors were encountered: