我定义了一个 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处理多线程的方式吗?我感到很困惑..