2016-12-10 42 views
0

セッション変数が本質的にスレッドセーフではないと考えると、サーブレットでセッション変数を初期化するきれいできれいな方法は何でしょうか?サーブレットでセッション変数を初期化する最もきれいな方法

は、以下のコードを検討:上記のコードで

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // NOT thread safe 
    if(request.getSession().getAttribute("mySessionVariable") == null) 
     request.getSession().setAttribute("mySessionVariable", new AtomicInteger(0)); 

    ((AtomicInteger) request.getSession().getAttribute("mySessionVariable")).incrementAndGet(); 

} 

を、2つのスレッドが同時に変数がヌルであることがわかり、そしてその両方これを回避するために0に初期化、のなる可能性がありますもちろん、同期ブロックを使用することができます:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    synchronized(this){ 
     if(request.getSession().getAttribute("mySessionVariable") == null) 
      request.getSession().setAttribute("mySessionVariable", new AtomicInteger(0)); 

     ((AtomicInteger) request.getSession().getAttribute("mySessionVariable")).incrementAndGet(); 
    } 

} 

しかし、私は同じことを達成するためのクリーナーと "きれいな"方法はありますか?

答えて

0

ユーザーセッションが作成されると、あなたはセッションでmySessionVariable属性を追加することができますが:

session.setAttribute("mySessionVariable", new AtomicInteger(0)); 

あなたが明示的にサーブレットでのセッションの作成を処理していない場合は、あなたがして、初期化を行うことができますpublic void sessionCreated(HttpSessionEvent arg0)方法のHttpSessionListener

あなたはもはや属性を初期化する必要があるとAtomicIntegerセットアトミックint値、していないので、だから、このコードはスレッドセーフになり:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ 

    ((AtomicInteger)request.getSession().getAttribute("mySessionVariable")).incrementAndGet(); 

} 
+0

良い提案だが、私がすることができますいくつかの理由」それを動作させる - 私の[その他の質問](http://stackoverflow.com/questions/41082885/httpsessionlistener-sessioncreated-not-being-called)を参照してください。 – BadCash

関連する問題