在Springmvc中是@Autowired HttpSession线程安全吗?

时间:2012-12-31 03:20:38

标签: multithreading spring thread-safety httpsession

我在HttpSession Spring MVC中使用@Autowired个对象:

public abstract class UserController {
    @Autowired
    public HttpSession session;

    @RequestMapping(value = { "" }, method = { RequestMethod.GET })
    public ModelAndView index(){
        User user=(User)session.getAttribute("loginUser");
    }
}

是会话线程安全吗?

1 个答案:

答案 0 :(得分:2)

从Spring获得的内容只是HttpSession。没有特殊的线程安全保证。

使用HttpSession的实现不一定是线程安全的。另请参阅此问题:Is HttpSession thread safe, are set/get Attribute thread safe operations?

您可以通过以下方式减少竞争条件导致问题而无法同步的可能性:

  • 减少会话同时处理两个请求的可能性
  • 没有从请求线程
  • 之外的其他线程中弄乱会话

如果您需要异步处理会话中的数据,我发现从请求线程中的会话中提取不可变对象然后在服务器上的异步进程中使用它们是更好的策略。这样您就可以尽可能避免从会话中访问。也就是说,如果你需要完全安全(为什么要承担风险),你需要同步。

synchronized(mutexFor(session)) {
  final String data = session.getAttribute("data");
  //do some work
  session.setAttribute("data", newValue);
}