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

use*_*868 1 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

是的,这应该是绝对正常的,只要该方法不使用/修改任何共享的可变状态,并且您只在正常的servlet处理中调用它 - 因此调用它的每个线程将传入它的请求/响应目前处理.

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


Sot*_*lis 5

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

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

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