我在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");
}
}
是会话线程安全吗?
答案 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);
}