java - 根据Java,这个方法是线程安全的吗

标签 java spring gwt

如果两个线程在服务器上访问此方法,它是线程安全的吗?线程来自 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 的注释之后,代码仍然不是线程安全的。

事实上,根据此 articleHttpSession 不是线程安全的。 :基本上, 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/

相关文章:

java - 哪个更好 - 使用 String 或 File 作为采用文件名的方法的参数类型

spring - 从 Spring Boot 应用程序访问 SessionFactory

spring - HttpMessageNotWritableException : No converter for [. ..] 带有预设的 Content-Type 'null' ] 带有 OpenApi Spring 生成器

java - Spring Boot 管理服务器 : App Specific Email Notification

GWT CellTable - 设置列宽

java - GWT DateBox - 禁用特定日期

java - 如果输入 tsv 文件具有 ' or ",则 CSVListReader 从 tsv 文件读取会中断

java - 如何使用 Apache POI 通过 Google App Engine 读取电子表格?

java - Swing 应用程序的 Graal native 图像 : Detected a started Thread in the image heap

javascript - GWT native 方法警告