单例servlet对象的Servlet规范

时间:2015-12-29 12:11:58

标签: java servlets java-ee servlet-3.0 java-ee-5

对于没有实现SingleThreadModel接口的servlet,如果是 service方法已经使用synchronized关键字定义,servlet容器不能使用实例池方法(摘自Java™Servlet Specification Version 2.5)

那么,它不是SingleThreadModel,但规范说实例池方法?通常,如果我们不描述SingleThreadModel的servlet,则只会创建一个实例。我很困惑。

2 个答案:

答案 0 :(得分:0)

你引用的句子不太清楚,但在我的解释中,它想说出以下内容:

如果Servlet没有实现SingleThreadModel但具有同步service方法(或同步HttpServlet#doGet等方法),那么servlet容器将使用servlet的实例池 这些请求将简单地通过线程同步进行序列化,性能对于并发请求将是不利的。

答案 1 :(得分:0)

你需要阅读servlet规范中的整个§2.3.3.1多线程问题(至少从Servlet 2.2开始,可能更早),以获得这句话的完整上下文

容器可以选择创建已实现javax.servlet.SingleThreadModel的servlet实例池,以提高并发性。然后,处理指向此servlet的请求的每个线程都可以执行它自己的servlet实例(可能从池中获取),而不是阻塞,直到先前的请求完成为止。

如果开发人员只选择synchronize service或相关方法,则容器不会使用此机制。

明确回答您的问题:

  

实例池将 从不 用于未实现SingleThreadModel的servlet。因此,这些类型的servlet将始终是单例。

虽然因为Servlet 2.4以来SingleThreadModel已被弃用,但这一切都没有实际意义。