Struts 2 拦截器是否是线程安全的?
Is a Struts 2 Interceptor which puts and pops to Value Stack thread-safe?
考虑一个将对象放入值堆栈的拦截器,执行一些逻辑然后将其删除:
ActionContext.getContext().getValueStack().set("user", CurrentUser);
doSomeLogic();
ActionContext.getContext().getValueStack().pop();
正如Are Interceptors in Struts2 Thread UNsafe?中提到的,拦截器是线程安全的,但是当我们在上面的代码中处理值堆栈时,我想知道这样是否可以,或者我们应该同步上面的代码部分。
作为次要问题,是否有更好的方法从值堆栈中删除元素?
As mentioned in Are Interceptors in Struts2 Thread UNsafe? the interceptors are thread safe
拦截器不是线程安全的;然而,在 JAVA 中, 方法是 。
如果您不使用static
变量或实例变量,方法中实例化的所有内容都是线程安全的,这意味着访问该方法的多个线程将访问它顺序地访问它,或者将在包含 class 的新实例中访问它。
变量永远不会混合,你不需要同步任何东西。
此外,ValueStack
存储在ActionContext
中,即ThreadLocal
,因此绝对是线程安全的。
顺便说一句...为什么不为此使用会话? :)
考虑一个将对象放入值堆栈的拦截器,执行一些逻辑然后将其删除:
ActionContext.getContext().getValueStack().set("user", CurrentUser);
doSomeLogic();
ActionContext.getContext().getValueStack().pop();
正如Are Interceptors in Struts2 Thread UNsafe?中提到的,拦截器是线程安全的,但是当我们在上面的代码中处理值堆栈时,我想知道这样是否可以,或者我们应该同步上面的代码部分。
作为次要问题,是否有更好的方法从值堆栈中删除元素?
As mentioned in Are Interceptors in Struts2 Thread UNsafe? the interceptors are thread safe
拦截器不是线程安全的;然而,在 JAVA 中, 方法是 。
如果您不使用static
变量或实例变量,方法中实例化的所有内容都是线程安全的,这意味着访问该方法的多个线程将访问它顺序地访问它,或者将在包含 class 的新实例中访问它。
变量永远不会混合,你不需要同步任何东西。
此外,ValueStack
存储在ActionContext
中,即ThreadLocal
,因此绝对是线程安全的。
顺便说一句...为什么不为此使用会话? :)