セッション変数が本質的にスレッドセーフではないと考えると、サーブレットでセッション変数を初期化するきれいできれいな方法は何でしょうか?サーブレットでセッション変数を初期化する最もきれいな方法
は、以下のコードを検討:上記のコードで
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();
}
}
しかし、私は同じことを達成するためのクリーナーと "きれいな"方法はありますか?
良い提案だが、私がすることができますいくつかの理由」それを動作させる - 私の[その他の質問](http://stackoverflow.com/questions/41082885/httpsessionlistener-sessioncreated-not-being-called)を参照してください。 – BadCash