servlet 是单例吗? [复制]

Posted

技术标签:

【中文标题】servlet 是单例吗? [复制]【英文标题】:Is servlet the singleton? [duplicate] 【发布时间】:2012-08-02 23:38:12 【问题描述】:

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

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

【问题讨论】:

servlet 不是单例,但您应该将其视为单例:同步或避免实例级属性。参见this。 【参考方案1】:

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

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

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

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

2.2 实例数

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

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

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

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

参考Java Servlet Specification 3.0 MR(第6-7页)

【讨论】:

经过充分研究但不正确。 Servlet 规范中没有任何内容可以阻止您在同一个 Web 应用程序中以不同的名称重新实例化同一个 servlet 类。因此,不是单身。 @EJP 我同意你的看法。看一下单例定义是不确定的。【参考方案2】:

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

【讨论】:

如果我在web.xml中只有一个MyServlet的映射规则并且没有使用@WebServlet注解,我能确定容器中总是只有一个MyServlet实例吗? @JimJim2000 除非您也避免使用SingleThreadModel,否则不会:请参阅其他答案。【参考方案3】:

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

这是>的摘录:

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

【讨论】:

【参考方案4】:

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

【讨论】:

这并没有为近 2 年前已经发布的答案添加任何内容。

以上是关于servlet 是单例吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Servet

servlet 中全局变量的使用

注入 Guice 的 DAO 应该是单例吗?

moment.js 是单例吗?

阿里短信接口 client 是单例吗

五种单例模式实现