【问题标题】:Is a Struts 2 Interceptor which puts and pops to Value Stack thread-safe?一个 Struts 2 Interceptor 是放入和弹出到值堆栈线程安全的吗?
【发布时间】:2015-09-08 09:45:49
【问题描述】:

考虑一个将对象放入值堆栈的拦截器,执行一些逻辑然后将其删除:

ActionContext.getContext().getValueStack().set("user", CurrentUser);

doSomeLogic();

ActionContext.getContext().getValueStack().pop();

正如Are Interceptors in Struts2 Thread UNsafe? 中提到的,拦截器是线程安全的,但是当我们在上面的代码中处理值堆栈时,我想知道这是否可以,或者我们应该同步上面的代码部分。

作为第二个问题,是否有更好的方法从值堆栈中删除元素?

【问题讨论】:

  • 从值堆栈中删除它的实际是什么?值堆栈是按请求创建的。它会自行消失。
  • 在回顾 struts 框架时,我发现 struts 总是将值放入它自己的值堆栈中,应用程序从中读取。我认为不建议应用程序在其中添加任何其他内容。这就是我删除推送值的原因。

标签: java multithreading struts2 thread-safety struts2-interceptors


【解决方案1】:

正如Are Interceptors in Struts2 Thread UNsafe? 中提到的,拦截器是线程安全的

拦截器是线程安全的;然而,在 JAVA 中,方法是

如果您不使用static 变量或实例变量,则在方法中实例化的所有内容都是线程安全的,这意味着访问该方法的多个线程将按顺序访问它,或者将访问它在包含类的新实例中。

变量永远不会混合,你不需要同步任何东西

另外,ValueStack 存储在ActionContext 中,即ThreadLocal,因此绝对是线程安全的。


顺便说一句...为什么不为此使用 Session 呢? :)

【讨论】:

  • 谢谢,关于为什么我们不能使用会话的长篇大论;)。你能告诉我从值堆栈中简单地弹出是否可以。有没有办法删除添加的密钥?!
  • TL;博士? :P 顺便说一句,是的,可以从堆栈中弹出值,并且,AFAIK,不,没有其他方法(但我通常不直接与堆栈混淆,RomanC 是你的人:D)跨度>
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2019-08-08
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多