![](/img/trans.png)
[英]HttpServlet using @Path(“/path”) with @POST versus doPost
[英]Request blocking in doPost() of a HttpServlet
我定義了一個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);
處等待lock.wait(15000);
然后第二個請求到來,它應該在synchronized(lock);
被阻塞synchronized(lock);
和我想象的一樣。 但是事實是第二個請求被doPost
方法阻止了。 在第一個請求發出后lock.notifyAll();
然后第二個請求進入doPost
方法並顯示“開始”。
我發現只有在兩個請求查詢完全相同的網址時才會發生這種情況。 這是Tomcat處理多線程的方式嗎? 我感到很困惑..
只有servlet的doPost
和doGet
方法是線程安全的,這意味着對於每個線程,它們都是獨立調用的。 類本身僅實例化一次。
在上面的代碼中,您將獲得對類變量的鎖定,該鎖定將在所有請求中共享,因此您將獲得每個請求的鎖定。
為了獲得預期的行為,請instantiation inside
doPost方法instantiation inside
移動“對象instantiation inside
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.