在Servlet服务方法

时间:2017-11-20 18:10:27

标签: java servlets

我正在阅读Servlet规范并遇到了这个:

  

对于没有实现SingleThreadModel接口的servlet,如果服务   方法(或调度到服务的方法(如doGet或doPost)   已经使用synchronized定义了HttpServlet抽象类的方法   关键字,servlet容器不能使用实例池方法,但必须   通过它序列化请求。

我不明白为什么servlet容器不能使用实例池方法和同步服务方法。实例池是否包含不同的servelet实例,以便每个实例都使用自己来同步方法(不相互阻塞)?

根据我的理解,在这种情况下,synchronize将无用,但它不会阻止servlet容器使用实例池。

我错过了什么?

感谢。

1 个答案:

答案 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的实例