最简洁的方法来初始化servlet中的会话变量

时间:2016-12-10 17:51:55

标签: java multithreading session servlets

在servlet中初始化会话变量的干净利落的方法是什么,考虑到会话变量本身并不是线程安全的?

请考虑以下代码:

function calculator(firstNumber) {

    function sum() {
        var result = firstNumber;
        for (let i = 0; i < arguments.length; i++) {
            result += arguments[i];
        }
        return result;
    }

    function dif() {
        var result = firstNumber;
        for (let i = 0; i < arguments.length; i++) {
            result -= arguments[i];
        }
        return result;
    }

    return { sum: sum, dif: dif };
}

var myCalculator = calculator(10);
console.log(myCalculator.sum(2, 3));
console.log(myCalculator.dif(1, 2, 5));

在上面的代码中,两个线程有​​可能同时看到变量为null,因此将它初始化为0.为了避免这种情况,当然可以使用synchronized块:

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();

}

但是我想知道,有没有更清洁,更漂亮的&#34;实现同样的方法?

1 个答案:

答案 0 :(得分:0)

创建用户会话时,您可以在会话中添加 session.setAttribute("mySessionVariable", new AtomicInteger(0)); 属性:

HttpSessionListener

如果您未在servlet中明确处理Session的创建,则可以使用public void sessionCreated(HttpSessionEvent arg0)方法中的AtomicInteger进行初始化。

因此,此代码变得线程安全,因为您不再需要初始化属性,int原子地设置protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ ((AtomicInteger)request.getSession().getAttribute("mySessionVariable")).incrementAndGet(); } 值,:

<,>,",/,\