如果两个线程在服务器上访问此方法,它是线程安全的吗?线程来自 GWT 计时器。
public UserDTO getUserFromSession()
{
UserDTO user = null;
HttpServletRequest httpServletRequest = this.getThreadLocalRequest();
HttpSession session = httpServletRequest.getSession();
Object userObj = session.getAttribute("user");
if (userObj != null && userObj instanceof UserDTO)
{
user = (UserDTO) userObj;
}
return user;
}
最佳答案
如果方法不访问外部(方法的)共享变量,则该方法是线程安全的。
您的代码中的问题可能出在该行代码上:
HttpServletRequest httpServletRequest = this.getThreadLocalRequest();
因为 this.getThreadLocalRequest()
似乎访问共享变量。
可以肯定的是,发布了整个类(class),但据我所知,它不是线程安全的。
此外,在解释 getThreadLocalRequest
方法安全地返回 HttpServletRequest
的注释之后,代码仍然不是线程安全的。
事实上,根据此 article,HttpSession
不是线程安全的。 :基本上, session 可以在代码执行期间发生变化。
例如,您也可以在 session 失效后返回用户。
想象一下以下步骤:
thread 1 thread 2
---------------------------------------------- --------------
Object userObj = session.getAttribute("user");
session.invalidate();
if (userObj != null && userObj instanceof UserDTO) {
user = (UserDTO) userObj;
}
return user;
最后,如果 session 被另一个线程无效,您也会返回一个用户。
关于java - 根据Java,这个方法是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039659/