2016-12-04 86 views
1

我知道如何在多线程web容器

什么Web容器创建每个请求一个新的线程来处理。

我不知道什么

每请求创建新的Servlet对象?

为什么我要问这是想知道如果同一个servlet对象用于多个请求,线程同步问题会如何发生。如果web容器为每个新请求创建一个新的servlet对象,没有看到问题。但是,如果它使用相同的servlet对象来提供多个请求,则可能会发生同步问题。

在典型的java web容器中如何处理?

回答

2

Web容器为每个请求创建一个新线程。

不。它重用线程池中的线程。

是否为每个请求创建新的servlet对象?

不是。一个servlet是一个单身人士。每个Web应用程序只创建一个实例。您的servlet必须是线程安全的,因为它由多个线程同时调用。但这通常很容易,因为servlet通常是无状态的。

1

是否为每个请求创建新的servlet对象?

默认情况下,Servlet容器创建一个单独的servlet实例,并将用于提供单独线程中的所有请求。所以请确保您的servlet类是线程安全的(即您的servlet类不应将任何有状态数据保存为实例变量等)。

除此之外,Servlet容器在容器启动期间或在收到第一个请求时创建servlet实例。 您可以通过在web.xml@WebServlet(urlPatterns="/xyz", loadOnStartup=1))中指定load-on-startup来强制容器创建servlet实例。

使用load-on-startup加载小服务程序(除非您有任何特殊要求)通常会更好,以便第一个请求不会受到性能影响。

0

一般来说,servlet是单例,但是如果您使用不同的名称将相同的servlet类映射到不同的URL映射,那么您将拥有多个相同servlet的实例。

大多数情况下,servlet是无状态的,如果你确实使它们有状态,那么对共享可变性要非常小心。 早期的servlet API曾经让SingleThreadModel接口在一个时间点实施单线程访问,这样一次只能提供一个请求,但是我发现这个接口在最近的API中被弃用,因为它并没有解决并发问题问题充分,像静态变量等