1

我定义了一个 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方法并打印“开始”。

我发现只有当两个请求查询完全相同的 url 时才会发生这种情况。这是Tomcat处理多线程的方式吗?我感到很困惑..

4

1 回答 1

0

只有 servlet 的doPostanddoGet方法是线程安全的,这意味着对于每个线程它们都是独立调用的。类本身只实例化一次。
在上面的代码中,您正在获取将在所有请求中共享的类变量的锁定,因此您将获得每个请求的锁定。

要获得您的预期行为,请移动您的“Object instantiation insidedoPost”方法。

于 2013-02-25T08:56:09.117 回答