1

我有一个带有static两个参数的方法的类HttpServletRequest request- 和HttpServletResponse response

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

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

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

4

3 回答 3

5

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

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

于 2013-10-30T21:04:51.070 回答
5

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

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

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

于 2013-10-30T21:14:52.270 回答
0

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

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

于 2013-10-30T21:04:34.047 回答