2016-12-10 2 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(); 

} 

В приведенном выше коде, существует вероятность того, что два потока одновременно будет видеть, что переменная имеет нулевое значение, и для этого и инициализировать его в 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)); 

Если вы не обрабатываете явно создание сессии в сервлет, вы можете сделать инициализацию с HttpSessionListener в методе public void sessionCreated(HttpSessionEvent arg0).

Таким образом, этот код становится поточно, так как вам не нужно инициализировать атрибут больше и AtomicInteger множества атомарного значения int,:

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

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

} 
+0

Это хорошее предложение, но по какой-то причине я могу» t заставить его работать - см. мой [другой вопрос] (http://stackoverflow.com/questions/41082885/httpsessionlistener-sessioncreated-not-being-called). – BadCash

Смежные вопросы