Java HttpServlet的doPost()中的请求阻塞
我定义了一个servlet(将其映射到/index)并重写doPost方法,如下所示:Java HttpServlet的doPost()中的请求阻塞,java,multithreading,servlets,blocking,Java,Multithreading,Servlets,Blocking,我定义了一个servlet(将其映射到/index)并重写doPost方法,如下所示: private Object lock = new Object(); protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("start"); sy
private Object lock = new Object();
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("start");
synchronized(lock) {
try {
lock.wait(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.notifyAll();
}
}
当第一个请求进入时,它打印“开始”,然后在lock.wait(15000)处等待代码>
然后第二个请求来了,它应该在synchronized(lock)被阻塞代码>如我所想。但事实是第二个请求被doPost
方法阻止。在第一个请求发出后,lock.notifyAll()
然后第二个请求进入doPost
方法并打印“start”
我发现只有当两个请求查询完全相同的url时才会发生这种情况。这是Tomcat处理多线程的方式吗??我很困惑..只有servlet的doPost
和doGet
方法是线程安全的,这意味着每个线程都会独立调用它们。类本身只实例化一次
在上面的代码中,您获得了类变量的锁,该类变量将在所有请求中共享,因此您将获得每个请求的锁
要获得预期的行为,请将“Object实例化移到
doPost`方法中。请参阅以更好地了解Java Web应用程序服务器(不仅仅是Tomcat)如何与Servlet
s和Thread
s一起工作。顺便说一句,在Web应用程序中绝对不能使用此类代码(至少在您希望被解雇的情况下)。被解雇
?我想他们会寻找谁雇佣的?问题是doPost()中的请求阻塞
,所以我相信这就是所需/预期的行为