如果对servlet有100个同时的doGet()请求,它会阻止其他99个请求,直到被调用的doGet()返回?

时间:2012-10-21 10:48:32

标签: java java-ee web-applications servlets

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

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

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

您也可以将线程设置为阻止。

答案 2 :(得分:2)

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

这就是Java Servlet规范3.0关于处理请求的内容

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

答案 3 :(得分:2)

Web服务器生成一个线程来为每个客户端提供服务。因此,即使您有一个servlet,每个客户端也会通过不同的线程调用每个方法 所以你可以理解,不会阻止它 这就是开发人员负责确保您的servlet是线程安全的原因

答案 4 :(得分:2)

通常,它取决于servlet容器。然而,大多数是多线程的。他们将在多个线程中调用doGet() 100次,因此多个线程可以同时使用相同的servlet对象。因此,您必须使您的servlet在线程安全,或者您的servlet似乎在低负载下工作,但在您开始获得更多请求时神秘地崩溃。

答案 5 :(得分:1)

  

因为doGet和doPost不同步。

方法签名是

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

因此,完全由您负责处理其他人在此提及的多线程场景。

  

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

doGet(..){

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

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

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