【发布时间】:2021-04-10 08:03:03
【问题描述】:
我正在使用 InheritableThreadLocal 为线程和子线程准备数据。
static InheritableThreadLocal<SomeType> instance
另外,我正在使用类似这样的并行流:
someStream.parallel().forEach(this::doSomething);
另外,我用的是spring AOP,会被doSomething方法触发:
@Around(value = "within(package.SomeService+)")
public Object execution(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
instance.get(); // sometimes value is null sometimes not
}
InheritableThreadLocal 可以在除 AOP 执行方法之外的任何地方正常工作。有时实例不包含值。你知道为什么吗? 如果我将实例的值设置为并行流函数的第一行,这与并行流有关,我没有问题。你知道原因还是我错过了什么?
【问题讨论】:
-
这 someStream.forEach(this::doSomething);有效吗?
-
但是如果
doSomething在不同的线程中被调用(这是在并行流上使用操作时的可能性),难道不应该期望instance将属于不同的线程?您如何确保在所有这些线程中初始化线程本地? -
@dreamcrash 是的,someStream.forEach 有效,但我需要并行执行。
-
@ernest_k 如果我理解正确 InheritableThreadLocal 需要自动将此值添加到子线程中,我可以在除 AOP 方法之外的所有方法中的所有子线程中看到此值
-
@AkifHadziabdic 理论上是的,但我还是会尝试以防万一
标签: java spring spring-boot spring-aop