我定义了一个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处理多线程的方式吗?我很困惑..
答案 0 :(得分:0)
只有servlet的doPost
和doGet
方法是线程安全的,对每个线程来说都是独立调用的。类本身只被实例化一次。
在上面的代码中,您将获取将在所有请求中共享的类变量锁,因此您将按请求锁定。
要获得预期的行为,请移动“对象instantiation inside
doPost”方法。