为什么apache servlet是单例?

时间:2012-05-19 12:34:30

标签: java servlets

  HttpServletRequest request;
  HttpServletResponse response;

  public void doGet(HttpServletRequest request , HttpServlet response){
         this.request = request;
         this.response = response;
  }

如果此servlet一次收到多个请求会怎样?

我们遇到了响应不匹配问题。这是一个问题吗?

6 个答案:

答案 0 :(得分:4)

您的Web应用程序容器仅加载一个servlet实例。

要编写线程安全的servlet,你几乎不应该使用实例变量。将请求和响应设置为实例变量是完全错误的。 servlet的实例不属于单个请求。

如果您需要将请求或响应的元素提供给其他方法,请将它们传递给这些方法。您不需要它们作为实例变量。

答案 1 :(得分:2)

当然这是一个问题。 servlet是一个单例。相同的servlet实例用于处理对此servlet的所有请求。并且请求当然是同时处理的。这意味着如果你这样做,thread1将使用通常由thread2处理的请求和响应。

答案 2 :(得分:1)

引用Servlet规范

“每个请求和响应对象仅在servlet的服务方法范围内有效,或者在过滤器的doFilter方法范围内有效。容器通常是回收的 请求对象以避免请求对象的性能开销 创建。开发人员必须意识到维护对请求对象的引用 不建议在上述范围之外,因为它可能具有不确定性 结果。 “

答案 3 :(得分:0)

这肯定会产生问题,任何实例变量都是共享的,因为servlet是singleton,因此并发请求和响应对象将被覆盖。

答案 4 :(得分:0)

发生的情况是,您的servlet会立即变为不可重入,并且在第一次同时被多个客户端调用时肯定会失败。你不能这样做。

答案 5 :(得分:-2)

这是一个问题,永远不建议将HttpServletRequest请求/ HttpServletResponse响应声明为实例变量。实际上Servlet正在实现单线程模型,这意味着只创建了一个servlet实例。每个请求都有一个线程。因此,如果它们有很多请求,则thr必须是多个线程,并且每个线程共享相同的servlet实例,这将导致数据不匹配或数据不一致问题。线程将在相同的实例上工作。