多个线程中怎么只能存在一个servlet实例?

Tam*_*ang 1 java multithreading tomcat servlets

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

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

Jas*_*key 5

Servlet规范#2.2规定:

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

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

所以,不要使用 SingleThreadModel 就行了。

此外,Creating Servlets指出

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

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