5

我读到 web 服务器实例化 servlet 一次,然后为对该 servlet 的每个请求调用其doGet()doPost()方法。现在,如果有 100 个同时对该 servlet 的请求并且 web 服务器调用doGet()了一个这样的请求,它将阻止其他 99 个请求,直到被调用的doGet()方法返回?

4

6 回答 6

6

不,它不会,它只会在 100 个不同线程中的同一个 servlet 实例上调用 doGet()。如果没有空闲线程来处理请求,传入的请求将被阻塞。

于 2012-10-21T10:52:54.473 回答
4

不,在正常情况下,会为每个请求创建新线程。

您可以在 servlet 容器中设置每个线程的数量。

您还可以将线程设置为阻塞。

于 2012-10-21T10:53:41.727 回答
2

所有请求都将在其自身的单独线程中处理,因此不会阻塞。每当新请求到来时,容器将产生一个新线程来处理它。

这就是 Java Servlet 规范 3.0 关于处理请求的说法

基本Servlet接口定义了处理客户端请求的服务方法。对于 servlet 容器路由到 servlet 实例的每个请求,都会调用此方法。处理对 Web 应用程序的并发请求通常需要 Web 开发人员设计 servlet,这些 servlet 可以处理在特定时间在服务方法中执行的多个线程。通常,Web 容器servlet通过在不同线程上并发执行服务方法来处理对相同的并发请求。

于 2012-10-21T10:51:57.707 回答
2

Web 服务器产生一个线程来服务每个客户端。因此,即使您有一个 servlet,每个方法也将由每个客户端的不同线程调用。
因此,您可以理解,不,它不会阻塞。
这就是为什么的开发人员有责任确保您的 servlet 是线程安全的

于 2012-10-21T10:52:35.887 回答
2

一般来说,它依赖于 servlet 容器。然而,大多数都是多线程的。它们将在多个线程中调用doGet()100 次,因此多个线程可以同时使用同一个 servlet 对象。因此,您必须使您的 servlet 线程安全,否则您的 servlet 似乎在低负载下工作,但当您开始收到更多请求时,它就会神秘地崩溃。

于 2012-10-21T10:52:43.843 回答
1

不。

因为 doGet 和 doPost 不同步。

方法签名是

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException

因此,您有责任处理其他人在这里提到的多线程场景。

是的

比如说,在代码执行路径中,例如,假设您在 doGet() 方法中调用如下方法

doGet(..){

   ObjectApple.doRipe() --> ObjectWater.needMoreWater() 

}
  • --> 表示第一个方法调用/调用另一个

并且在 ObjectWater 的实现中,你有一个共享资源(为了线程安全,应该同步),比如一个成员变量,那么你所有的其他 99 个线程当然都会被阻塞 - 如果它是一个阻塞的资源/数据结构。

于 2015-01-08T16:31:30.860 回答