3

众所周知,Servlet对各个请求使用单独的线程,这提高了服务器的效率。然而,在 struts2 框架中,每个映射的 Action-Class都为各自的requests创建了自己的对象。

现在,与普通 servlet 中的线程相比,在 struts2 中拥有单个对象是一种好的做法(优化)吗?为什么我们不只有 servlet!?

4

1 回答 1

5

当请求进入 Web 容器时,容器会从池中获取一个线程来执行请求。处理请求后,线程将返回池以用于后续请求。可以并行处理多个请求,因为池中有多个线程可用。

您在 Web 应用程序中声明的每个 servlet 仅由 Web 容器实例化一次。因此,多个并发线程使用每个 servlet 的单个实例。这就是为什么您的 servlet 必须是线程安全的。

Struts 对上述内容没有任何改变。它的作用是定义一个处理所有请求的 servlet 或过滤器。对于针对给定动作路径的每个请求,都会创建一个新的 Struts Action 实例。这就是带有 servlet 的模型不同的地方。servlet 是一个单例(所有请求只有一个实例),而新的 Struts 操作会为每个请求实例化。

优点是动作不需要是线程安全的,因为它只被一个线程使用,然后被丢弃。它可以包含中间状态而不需要任何同步。缺点是创建了许多实例。但是由于 Java 垃圾收集器在回收像 Struts 操作这样的短期对象方面非常快,因此在实践中不会造成任何问题。

于 2012-11-02T22:28:28.563 回答