1

我正在开发一个部署到 JBoss 4.2.3 的企业应用程序。它使用 Servlet 2.5 规范。

该应用程序有一些 JSP 使用带有此指令的 SingleThreadModel (STM):<%@ page isThreadSafe="false" %>

我想知道 JBoss 4.2.3 如何实现 SingleThreadModel (STM):

  1. 它是否只有 1 个 servlet 实例并对其上的所有请求进行序列化?
  2. 或者它有多个 servlet 实例并同时处理每个请求?

我怎样才能找到这些信息?

谢谢

4

1 回答 1

0

根据JBOSS Documents,这可以在两种模型中完成:

servlet 容器可以通过同步对单个 servlet 实例的访问,或者通过维护一个 servlet 实例池并将每个新请求分派给一个空闲的 servlet 来保证这一点

请注意,这不是完全线程安全的:

请注意,SingleThreadModel 并不能解决所有线程安全问题

和:

会话属性和静态变量仍然可以被多个线程上的多个请求同时访问

所以我认为答案是这个指令(以及扩展 SingleThreadModel servlet)将阻止多个线程同时调用servlet 的单个实例service的方法,并且不会阻止 Web 服务器使用 servlet 的多个实例同时提供请求。

换句话说,一个实例不会同时在多个线程中服务请求,但是 Web 服务器可以创建 servlet 的多个实例,并将每个请求同时分配给一个实例。

更新

我在 catalina 核心中发现了 20 个 maxInstances 的常量,它将实例化多达 20 个 servlet 实例来服务同时接收到 servlet 的请求,如果没有空闲实例,则等待有一个空闲的 servlet 实例。

于 2016-04-23T19:49:03.623 回答