Что было бы чистым и аккуратным способом инициализации переменной сеанса в сервлете, учитывая переменные сеанса, по сути, не являются потокобезопасными?Самый чистый способ инициализации переменной сеанса в сервлете
Рассмотрим следующий код:
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();
}
}
Но я задаюсь вопросом, есть ли чище и «красивее» способы достижения то же самое?
Это хорошее предложение, но по какой-то причине я могу» t заставить его работать - см. мой [другой вопрос] (http://stackoverflow.com/questions/41082885/httpsessionlistener-sessioncreated-not-being-called). – BadCash