考虑一个拦截器,它将一个对象放在Value Stack中,做一些逻辑然后删除它:
ActionContext.getContext().getValueStack().set("user", CurrentUser);
doSomeLogic();
ActionContext.getContext().getValueStack().pop();
正如Are Interceptors in Struts2 Thread UNsafe?中提到的,拦截器是线程安全的,但是当我们在上面的代码中处理Value Stack时,我想知道这是否正常,或者我们应该在代码段上面进行同步。
作为次要问题,是否有更好的方法从值堆栈中删除元素?
答案 0 :(得分:1)
如Are Interceptors in Struts2 Thread UNsafe?中所述,拦截器是线程安全的
拦截器 NOT 线程安全;但是,在JAVA中,方法。
如果不使用static
变量或实例变量,则在方法内实例化的所有内容都是线程安全的,这意味着访问该方法的多个线程将按顺序访问它,或者将在包含类的新实例中访问它。
变量永远不会混淆,并且你不需要同步任何东西。
此外,ValueStack
存储在ActionContext
中,即ThreadLocal
,因此绝对是线程安全的。
BTW ......为什么不为此使用Session? :)