对于没有实现SingleThreadModel接口的servlet,如果是 service方法已经使用synchronized关键字定义,servlet容器不能使用实例池方法(摘自Java™Servlet Specification Version 2.5)
那么,它不是SingleThreadModel,但规范说实例池方法?通常,如果我们不描述SingleThreadModel的servlet,则只会创建一个实例。我很困惑。
答案 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
已被弃用,但这一切都没有实际意义。