【问题标题】:Is this code threadsafe? Static method modifying http servlet request这个代码线程安全吗?修改httpservletrequest的静态方法
【发布时间】:2013-10-30 21:01:50
【问题描述】:

我有一个带有static 方法的类,它接受两个参数-HttpServletRequest requestHttpServletResponse response

public class RequestProcessor {
    public static processRequest(HttpServletRequest request, HttpServletResponse response) {
    //read request and write data to response
    }
}

多个线程可以同时调用 RequestProcessor.processRequest 方法。

在做了一些研究之后,我的理解是,由于堆栈是线程本地的,所以这应该不是问题,但我不确定这段代码是否仍然是线程安全的,因为 HttpServletRequest 请求和 HttpServletResponse 响应不是不可变的

【问题讨论】:

  • 只要processRequest 没有修改任何静态类变量,你还应该担心吗?

标签: java multithreading servlets thread-safety


【解决方案1】:

是的,这绝对没问题,只要该方法不使用/修改任何共享的可变状态,并且您只在正常的 servlet 处理中调用它 - 所以调用它的每个线程都会在请求中传递/它当前正在处理的响应。

(如果多个线程开始修改同一个请求/响应,那肯定会导致问题。)

【讨论】:

    【解决方案2】:

    您应该了解Servlet 容器的工作原理。容器拥有一个线程池。当它收到一个请求时,它会选择一个可用的线程。在该线程 (YMMV) 中,它创建 HttpServletRequestHttpServletResponse 对象。然后它会获得对用于处理请求的Servlet 的引用。最后,仍然在线程中,它将调用Servlet#service(..),传入它之前创建的HttpServletRequestHttpServletResponse 对象。

    方法是static 的事实没有区别。您需要知道您在当前范围内拥有的对象引用是否可以从另一个Thread 访问。

    如果我们在您的示例中假设 HttpServletRequest 参数不与任何其他 Thread 共享,那么在您的 processRequest 方法的范围内,它将是线程安全的,因为没有其他线程可以来访问它并修改它。

    【讨论】:

      【解决方案3】:

      如果您使用来自不同线程的相同对象调用此方法(并修改它们),那么不,它不是线程安全的。

      如果您正在跨线程修改它们,则需要在这些对象周围添加锁,以免出现任何意外和奇怪的行为。

      【讨论】:

      • 大多数对象 不会 抛出 ConcurrentModificationException - 它们只会表现得很奇怪,或者看不到来自所有线程的所有更新等。我不记得看到 CME 除了来自收藏。
      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多