如何在多个线程中只存在一个servlet实例?

时间:2014-08-13 09:16:28

标签: java multithreading tomcat servlets

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

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

2 个答案:

答案 0 :(得分:4)

Servlet Specification #2.2表示:

  

对于未在分布式环境中托管的servlet(默认),    servlet容器每个servlet只能使用一个实例   宣言。但是,对于实现SingleThreadModel的servlet   接口,servlet容器可以实例化多个实例   处理繁重的请求加载并将请求序列化到特定的   实例

     

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

所以, NOT 使用SingleThreadModel会成功。

此外,Creating Servlets表示

  

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

所以,你应该处理你的情况下的同步;

答案 1 :(得分:1)

Servlet由Servlet容器实例化,您无法明确控制它。

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

而是使您的Servlet实现,以便它不依赖于有多少实例(例如,不使用静态属性)。

<强>更新

引自Servlet specification 2.3部分#2.3.1:

  

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