我有一个Java Servlet,它有一个重复的代码,我会把它放到一个清理代码的方法中。
问题是我读过如果我使用辅助方法可能会出现并发问题。
这是真的吗?
这是我的代码,重复几次:
if(session.getAttribute("attemps") == null) {
session.setAttribute("attemps", 1);
}
else {
Integer attemps = (Integer) session.getAttribute("attemps");
session.setAttribute("attemps", attemps + 1);
}
我会在里面创建一个带有此代码的方法,然后在需要时调用该方法。
感谢。
答案 0 :(得分:1)
将代码提取到单独的方法时,不会发生并发问题。当多个并发线程访问可变状态时会发生并发问题。
你在这里确实有可变状态:会话。来自同一浏览器的两个请求可以同时处理,这可能导致竞争条件。会话本身是线程安全的,但是因为你正在对会话进行check-then-act和get-then-set操作,虽然会话是安全的,但你最终可能会得到错误的结果。
例如,两个线程可能同时检查null,可以同时将attempts属性视为null,并且可以将其值设置为1.因此,最终会尝试1次而不是2次。