rd.forward(this.request, this.response);
这个(双关语意)建议您已分配一个类的实例变量,
request并将其
response作为实例变量。您的具体问题又提示该类本身的实例不是线程安全的。
假设它实际上是servlet本身,那么就可以确定问题的原因。Servlet根本不是线程安全的。在webapp启动期间,仅创建了一个实例,然后在 整个
应用程序的 所有 请求之间共享。
你应该 永远不会
分配请求或会话范围的数据作为servlet的一个实例变量。仅当同时发生另一个HTTP请求时,才会覆盖它。遇到您自己时,这会使您的代码不安全。
以下代码说明了这一点:
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. } }将HTTP请求本身分配为servlet的实例变量实际上是一个重大错误。当用户Y在Servlet处理用户X的请求的同时激发另一个请求时,用户X将立即获得用户Y
的
request和
response对象。这绝对是线程不安全的。造成NPE的原因
request是,在那一刻,用户Y的处理“完成”,因此释放/销毁了。



