其他分享
首页 > 其他分享> > 多线程 – SpelExpression线程安全吗?

多线程 – SpelExpression线程安全吗?

作者:互联网

具体来说,可以从具有不同上下文的同一SpelExpression上的多个线程安全地调用getValue(StandardEvaluationContext,Class)吗?

我看到Spring Source的Gary Russell提出并回答了这个问题.但是,我也看到有人报告并发问题.我查看了相关Spring类的源代码,我无法确定.

我希望得到Spring开发人员和Spring用户的明确答复,他们在严重并发的环境中使用过这个类.

谢谢.

解决方法:

我知道你想要另一种观点,但我会澄清它是线程安全的,只要你在另一个线程使用它时不改变评估上下文(或者你每次使用新的评估上下文,如果你需要用变量等来定制它),

但是,您必须将根对象传递给getValue(),而不是在上下文中设置根对象(使用setRootObject() – 这会改变上下文).如果您有#root对象,请使用

getValue(EvaluationContext context, Object rootObject, Class<T> expectedResultType)

如果您没有根对象,并且不以其他方式改变上下文,则可以使用

getValue(EvaluationContext context, Class<T> expectedResultType) 

具有共享上下文.

Spring Integration在(在很多情况下)高度多线程环境中广泛使用SpEL.我们对所有静态情况(没有运行时变量)使用相同的评估上下文,并将根对象(通常是消息)传递给getValue()调用.对于需要向上下文添加变量的情况,每个评估都会获得一个新的评估上下文.

标签:multithreading,spring,spring-el
来源: https://codeday.me/bug/20190629/1321119.html