通常,容器中只有一个特定servlet的实例。这个servlet可以为每个请求重用。但是,默认情况下,每个servlet请求都在不同的线程中运行。比方说,只有一个扩展HttpServlet的servlet实例存在于对doPost(请求,响应)的两个不同调用中?
我想确认是否有两个堆栈使用一个堆。
答案 0 :(得分:4)
对于未在分布式环境中托管的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实例池 使用