在HttpServlet的doPost()中请求阻塞

时间:2013-02-25 08:50:16

标签: 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");
        synchronized(lock) {
            try {
                lock.wait(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.notifyAll();
        }
    }

当第一个请求进入时,它会打印'start'然后等待lock.wait(15000); 然后第二个请求来了,它应该在synchronized(lock);被阻止,正如我所想的那样。但事实是第二个请求被阻止在doPost方法之外。第一个请求转到lock.notifyAll();后,第二个请求进入doPost方法并打印'start'。

我发现这只发生在两个请求查询完全相同的URL时。这是Tomcat处理多线程的方式吗?我很困惑..

1 个答案:

答案 0 :(得分:0)

只有servlet的doPostdoGet方法是线程安全的,对每个线程来说都是独立调用的。类本身只被实例化一次。
在上面的代码中,您将获取将在所有请求中共享的类变量锁,因此您将按请求锁定。

要获得预期的行为,请移动“对象instantiation inside doPost”方法。