这段代码是否安全?修改http servlet请求的静态方法

时间:2013-10-30 21:01:51

标签: java multithreading servlets thread-safety

我的课程采用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响应不是不可变的

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

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