31

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

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

4

4 回答 4

25

查看Cunningham & Cunningham, Inc. Wiki中定义的单例模式的定义

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

我会说,不。从容器的角度来看,一个 servlet 对象被接受和管理,包括创建一个ServletContext,但这并不妨碍 servlet 的实例不超过一个。

关于此类问题,我认为最好查看相应的合同,这是在Java Servlet Specification中定义的 servlet 的情况下。他们已经解决了 servlet 实例的数量。

2.2 实例数

通过第 8 章“注解和可插入性”中描述的注解或第 14 章“部署描述符”中描述的包含 servlet 的 Web 应用程序的部署描述符的一部分,servlet 声明控制 servlet 容器的方式提供 servlet 的实例。对于不在分布式环境中托管的 servlet(默认设置),servlet 容器必须在每个 servlet 声明中仅使用一个实例。但是,对于实现 SingleThreadModel 接口的 servlet,servlet 容器可能会实例化多个实例来处理繁重的请求负载并将请求序列化到特定实例。

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

它只指定容器只能使用一个实例(在前一种情况下),正如EJP在评论中指出的那样:

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

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

于 2012-08-05T23:10:49.027 回答
15

不,您可以在同一个 Web 容器中,甚至在同一个 Web 应用程序中,以不同的 servlet 名称和 URL 多次实例化同一个 servlet 类。

于 2012-08-05T23:56:21.333 回答
0

Servlet 可以初始化为单个实例或实例池。

以下是 <<Java Platform, Enterprise Edition The Java EE Tutorial Release 7>> 的摘录:

Web 容器通常会创建一个线程来处理每个请求。为了确保 servlet 实例一次只处理一个请求,servlet 可以实现 SingleThreadModel 接口。如果 servlet 实现了这个接口,那么在 servlet 的 service 方法中不会有两个线程同时执行。Web 容器可以通过同步对 servlet 的单个实例的访问或通过维护 Web 组件实例池并将每个新请求分派到一个空闲实例来实现此保证。

于 2021-01-24T04:04:51.190 回答
-1

不,Servlet 不是单例。它可能会创建第二个 Object ,这取决于传入的请求和容器的行为。

于 2014-06-11T19:12:09.450 回答