Servlet可能与方法有并发问题?

时间:2016-06-24 19:10:58

标签: servlets methods concurrency

我有一个Java Servlet,它有一个重复的代码,我会把它放到一个清理代码的方法中。

问题是我读过如果我使用辅助方法可能会出现并发问题。

这是真的吗?

这是我的代码,重复几次:

if(session.getAttribute("attemps") == null) {
   session.setAttribute("attemps", 1);
}
else {
   Integer attemps = (Integer) session.getAttribute("attemps");
   session.setAttribute("attemps", attemps + 1);
}

我会在里面创建一个带有此代码的方法,然后在需要时调用该方法。

感谢。

1 个答案:

答案 0 :(得分:1)

将代码提取到单独的方法时,不会发生并发问题。当多个并发线程访问可变状态时会发生并发问题。

你在这里确实有可变状态:会话。来自同一浏览器的两个请求可以同时处理,这可能导致竞争条件。会话本身是线程安全的,但是因为你正在对会话进行check-then-act和get-then-set操作,虽然会话是安全的,但你最终可能会得到错误的结果。

例如,两个线程可能同时检查null,可以同时将attempts属性视为null,并且可以将其值设置为1.因此,最终会尝试1次而不是2次。