servlet是单身人士吗?

读一些书说servlet是从容器端单身的。 这是真的?

然而,即使它是单身,我们也需要处理数据同步等

不可以。您可以在同一个Web容器中的不同servlet名称和URL下多次实例化同一个servlet类,实际上也可以在同一个web-app中。

查看Cunningham&Cunningham, Inc。Wiki中定义的Singleton模式的定义

确保一个类只有一个实例,并提供一个全局访问点。

我会说,不。 从容器的角度来看,接受和管理一个servlet对象,包括创建ServletContext ,但它不会阻止servlet的实例不止一个。

关于这些问题,我认为最好查看相应的契约,这是在Java Servlet规范中定义的servlet的情况下。 他们已经解决了servlet实例的数量。

2.2实例数量

servlet声明是通过第8章“注释和可插入性”中描述的注释或包含servlet的Web应用程序的部署描述符的一部分,如第14章“部署描述符”中所述,控制servlet容器的方式提供servlet的实例。 对于未托管在分布式环境中的servlet(缺省值),servlet容器每个servlet声明必须只使用一个实例。 但是,对于实现SingleThreadModel接口的servlet,servlet容器可以实例化多个实例以处理繁重的请求加载并将请求序列化到特定实例。

在将servlet部署为部署描述符中标记为可分发的应用程序的一部分的情况下,每个Java虚拟机(JVM™)的容器可能每个servlet声明只有一个实例。 但是,如果可分发应用程序中的servlet实现SingleThreadModel接口,则容器可以在容器的每个JVM中实例化该servlet的多个实例。

它只指定容器必须只使用一个实例(在前一种情况下),并且正如EJP注释中指出的那样:

Servlet规范中没有任何内容阻止您在同一个Web应用程序中以不同的名称重新实例化相同的Servlet类。 Ergo,不是单身人士。

参考 Java Servlet规范3.0 MR (p.6-7)

不,Servlet不是Singleton。 它可能会创建第二个对象,取决于传入请求和Container行为。