在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;实现同样的方法?
答案 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();
}
值,:
<,>,",/,\