我读到 web 服务器实例化 servlet 一次,然后为对该 servlet 的每个请求调用其doGet()
和doPost()
方法。现在,如果有 100 个同时对该 servlet 的请求并且 web 服务器调用doGet()
了一个这样的请求,它将阻止其他 99 个请求,直到被调用的doGet()
方法返回?
6 回答
不,它不会,它只会在 100 个不同线程中的同一个 servlet 实例上调用 doGet()。如果没有空闲线程来处理请求,传入的请求将被阻塞。
不,在正常情况下,会为每个请求创建新线程。
您可以在 servlet 容器中设置每个线程的数量。
您还可以将线程设置为阻塞。
所有请求都将在其自身的单独线程中处理,因此不会阻塞。每当新请求到来时,容器将产生一个新线程来处理它。
这就是 Java Servlet 规范 3.0 关于处理请求的说法
基本Servlet
接口定义了处理客户端请求的服务方法。对于 servlet 容器路由到 servlet 实例的每个请求,都会调用此方法。处理对 Web 应用程序的并发请求通常需要 Web 开发人员设计 servlet,这些 servlet 可以处理在特定时间在服务方法中执行的多个线程。通常,Web 容器servlet
通过在不同线程上并发执行服务方法来处理对相同的并发请求。
Web 服务器产生一个线程来服务每个客户端。因此,即使您有一个 servlet,每个方法也将由每个客户端的不同线程调用。
因此,您可以理解,不,它不会阻塞。
这就是为什么您的开发人员有责任确保您的 servlet 是线程安全的
一般来说,它依赖于 servlet 容器。然而,大多数都是多线程的。它们将在多个线程中调用doGet()
100 次,因此多个线程可以同时使用同一个 servlet 对象。因此,您必须使您的 servlet 线程安全,否则您的 servlet 似乎在低负载下工作,但当您开始收到更多请求时,它就会神秘地崩溃。
不。
因为 doGet 和 doPost 不同步。
方法签名是
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
因此,您有责任处理其他人在这里提到的多线程场景。
是的
比如说,在代码执行路径中,例如,假设您在 doGet() 方法中调用如下方法
doGet(..){
ObjectApple.doRipe() --> ObjectWater.needMoreWater()
}
- --> 表示第一个方法调用/调用另一个
并且在 ObjectWater 的实现中,你有一个共享资源(为了线程安全,应该同步),比如一个成员变量,那么你所有的其他 99 个线程当然都会被阻塞 - 如果它是一个阻塞的资源/数据结构。