Java HttpServlet的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

我定义了一个servlet(将其映射到/index)并重写doPost方法,如下所示:

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()中的
请求阻塞
,所以我相信这就是所需/预期的行为