2

私はwith で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");
    }
}

セッションはスレッドセーフですか?

4

1 に答える 1

2

Spring から配線されるのは、HttpSession だけです。特別なスレッド セーフ保証はありません。

HttpSession を使用する実装は、必ずしもスレッドセーフではありません。この質問も参照してください: Is HttpSession thread safe, are set/get Attribute thread safe operations?

次の方法で、競合状態が同期せずに問題を引き起こす可能性を減らすことができます。

  • セッションで 2 つのリクエストが同時に処理されない可能性を減らす
  • リクエストスレッド以外のスレッドからのセッションをいじらない

セッションからのデータを非同期的に処理する必要がある場合は、リクエスト スレッドでセッションから不変オブジェクトを取得し、それらをサーバー上の非同期プロセスで使用する方が良い戦略だと思います。そうすれば、セッションからのアクセスをできるだけ回避できます。とはいえ、完全に安全である必要がある場合 (なぜ危険を冒す必要があるのか​​) は、同期する必要があります。

synchronized(mutexFor(session)) {
  final String data = session.getAttribute("data");
  //do some work
  session.setAttribute("data", newValue);
}
于 2012-12-31T03:27:19.483 に答える