为什么一个servlet实例只能存在于多个线程中?



通常,容器中只有一个特定的servlet实例。每个请求都重用这个servlet。但是,默认情况下,每个servlet请求在不同的线程中运行。比如说,如何在对doPost(请求、响应)的两个不同调用中只存在一个扩展HttpServlet的servlet实例?

我想确认是否有两个堆栈使用一个堆。

Servlet规范#2.2声明:

对于未托管在分布式环境中的servlet(默认), servlet容器必须每个servlet只使用一个实例声明。然而,对于实现SingleThreadModel的servlet接口时,servlet容器可以实例化多个实例处理繁重的请求负载并将请求序列化到特定的对象实例。

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

所以,do NOT use SingleThreadModel将使它生效。

另外,创建servlet声明

默认情况下,servlet不是线程安全的。方法在单个Servlet实例通常同时执行多次(以可用内存限制为限)。每次执行发生在不同的线程,尽管servlet中只存在一个servlet副本引擎。

所以,在您的例子中,您应该处理同步;

Servlet是由Servlet容器实例化的,您无法对其进行显式控制。

你不能强制在一个Servlet容器中只有一个特定的Servlet实例(尽管通常情况下是这样);至少不是以官方的方式,因为Servlet API没有提供任何方法来实现它。有些容器实现可能会为此提供一个任意的API,但我不会指望它。

相反,让你的Servlet实现不依赖于有多少实例(例如,不要使用静态属性)。

更新:

引用自Servlet规范2.3节#2.3.1:

重要的是要注意可以有多个实例给定Servlet类在Servlet容器中。例如,这个罐子发生在多个servlet定义使用具有不同初始化参数的特定servlet类。这也可能发生在servlet实现SingleThreadModel接口和容器创建servlet实例池使用。

最新更新