我正在阅读Servlet规范并遇到了这个:
对于没有实现SingleThreadModel接口的servlet,如果服务 方法(或调度到服务的方法(如doGet或doPost) 已经使用synchronized定义了HttpServlet抽象类的方法 关键字,servlet容器不能使用实例池方法,但必须 通过它序列化请求。
我不明白为什么servlet容器不能使用实例池方法和同步服务方法。实例池是否包含不同的servelet实例,以便每个实例都使用自己来同步方法(不相互阻塞)?
根据我的理解,在这种情况下,synchronize将无用,但它不会阻止servlet容器使用实例池。
我错过了什么?
感谢。
答案 0 :(得分:1)
这句话的意思是,如果你不实现SingleThreadModel
那么你的Servlet实例根本不会被汇集,无论它使用synchronization
还是。它提到synchronization
的唯一原因是警告你,Servlet容器不会在每个VM上使用多个Servlet实例,以允许它同时处理多个请求。
这是规范中另一个缺失的片段:
SRV.2.2实例数
作为其一部分的servlet声明 包含的Web应用程序的部署描述符 servlet,如第SRV.13章“部署描述符”中所述, 控制servlet容器如何提供servlet的实例。 对于未在分布式环境中托管的servlet(默认), servlet容器每个servlet只能使用一个实例 声明即可。 但是,对于实现SingleThreadModel的servlet 接口,servlet容器可以实例化多个实例 处理繁重的请求加载并将请求序列化到特定的 实例。 Servlet生命周期19在servlet的情况下 部署为部署描述符中标记的应用程序的一部分 作为可分发的,一个容器每个servlet可能只有一个实例 每个Java虚拟机声明(JVMTM) 1。 然而,如果 可分发应用程序中的servlet实现 SingleThreadModel接口,容器可以实例化多个 容器的每个JVM中的该servlet的实例