当前位置: 首页 > 面试题库 >

在Java中,如何确保我的Web应用程序是线程安全的?

子车高超
2023-03-14
问题内容

如何确保我的Java Servlet Web应用程序是线程安全的?关于会话变量,类的静态变量或其他可能导致线程安全的问题,我该怎么办?


问题答案:

事实:在webapp的生存期内只有一个servlet实例。它是在webapp启动时创建的,在webapp关闭时销毁的。另请参见此答案以进行粗略的解释。

因此,它已在所有请求(线程)之间共享。如果将请求或会话范围的数据分配为实例static变量(或更糟的是,作为)变量,则它绝对不是线程安全的,因为它随后在应用程序范围内的所有用户(会话)的所有请求(线程)之间共享。您只需要将它们分配为方法局部变量即可保持线程安全。所以:

public class MyServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

在开发考虑线程安全性的servlet时,基本上这就是您需要考虑的所有内容。

然后是HttpSession可以在同一用户的多个请求之间共享的session()属性,但是在现实世界中,您实际上不必担心同步会话访问。通常,您只在其中放置特定于用户的数据,例如已登录的用户,特定于用户的首选项,购物篮等。您只需要确保不将纯请求范围的数据放入会话范围即可。它会反映在同一会话内的多个浏览器窗口/选项卡中。

然后有application(ServletContext)属性,这些属性在整个应用程序范围内的所有用户之间共享,但是通常您只在其中放置常量和其他静态数据,例如webapp配置,DAO工厂,下拉列表内容等。所有这些都可以通过和完成ServletContextListener,也请参见基本示例的答案。您只需要确保不将纯请求范围或会话范围的数据放入应用程序范围即可。



 类似资料:
  • 问题内容: 是否可以通过任何常规方法或规则来确保专门用于任何应用程序的各种Utility类的静态方法的线程安全性。在这里,我想特别指出Web应用程序的线程安全性。 众所周知,以不可变对象作为参数的静态方法是线程安全的,而可变对象不是。 如果我有一个实用程序方法可用于的某些操作,并且该方法接受的实例,则该方法将不是线程安全的。那么如何在不更改参数传递方式的情况下使其成为线程安全的呢? 课堂也是可变的

  • 本文向大家介绍java枚举是如何保证线程安全的,包括了java枚举是如何保证线程安全的的使用技巧和注意事项,需要的朋友参考一下 前言 写在前面:Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。本文将深入分析枚举的源码,看一看枚举是怎么实现的,他是如何保证线程安全的

  • 攻击者无时无刻不在准备对你的 Web 应用程序进行攻击,因此提高你的 Web 应用程序的安全性是非常有必要的。幸运的是,来自The Open Web Application Security Project (OWASP) 的有心人已经整理了一份包含了已知安全问题和防御方式的全面的清单。这份清单对于具有安全意识的开发者来说是必读的。由 Padraic Brady 整理的 Survive The D

  • 本文向大家介绍如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?,包括了如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?的使用技巧和注意事项,需要的朋友参考一下 StringBuffer(线程安全) StringBuffer是线程安全的,这意味着它们具有同步方法来控制访问,因此一次只有一个线程可以

  • 本文向大家介绍在 Java 程序中怎么保证多线程的运行安全?相关面试题,主要包含被问及在 Java 程序中怎么保证多线程的运行安全?时的应答技巧和注意事项,需要的朋友参考一下 方法一:使用安全类,比如 Java. util. concurrent 下的类。 方法二:使用自动锁 synchronized。 方法三:使用手动锁 Lock。 手动锁 Java 示例代码如下:  

  • 本文向大家介绍如何保证线程安全?相关面试题,主要包含被问及如何保证线程安全?时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程 通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上可以通过适当的策略,保证任务与任务之间不存在共享资源,设计一个规则来保证一个客户的计算工作和数据访问只会被一个线程或一台工作机完成,而不是把一个客户的计算工作分配给多个线程去完成。