【问题标题】:is @Autowired HttpSession thread safe in springmvc?springmvc 中的@Autowired HttpSession 线程安全吗?
【发布时间】:2012-12-31 03:20:38
【问题描述】:

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

public abstract class UserController {
    @Autowired
    public HttpSession session;

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

会话是线程安全的吗?

【问题讨论】:

    标签: multithreading spring thread-safety httpsession


    【解决方案1】:

    你从 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);
    }
    

    【讨论】:

    • 那么,如果你有并行请求线程,会话是线程安全的,但如果并行线程不是请求线程,它就变成线程不安全的了?这是没有意义的。会话是线程安全的。可能是线程不安全的是存储在会话中的对象。
    • @JBNizet 您的解释确实毫无意义,我已经更改了措辞以避免这种情况。需要明确的是,HttpSession 是一个接口,所以实现是线程安全的或不是线程安全的。规范保证某些操作是线程安全的,但并非所有实现都符合这一点。另见:stackoverflow.com/questions/616601/…
    • 规范说:“容器必须确保对表示会话属性的内部数据结构的操作以线程安全的方式执行。开发人员有责任对属性对象本身进行线程安全访问” .所以会话是线程安全的。当然,正如您链接到的 IBM 文章所解释的那样,这不会使使用它的程序自动成为线程安全的。但这是每个线程安全对象的情况。
    • 你是对的@JBNizet,你同意现在的答案吗?
    • 实际上并非如此,但我会删除我的反对票。当涉及到正确性时,您不会“减少并发错误的机会”。通过了解自己在做什么,您仔细设计和编程以使您的代码正确。
    猜你喜欢
    • 2010-10-11
    • 2011-07-21
    • 2013-06-13
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2018-07-18
    • 2011-07-04
    相关资源
    最近更新 更多