簡體   English   中英

請求阻塞HttpServlet的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的doPostdoGet方法是線程安全的,這意味着對於每個線程,它們都是獨立調用的。 類本身僅實例化一次。
在上面的代碼中,您將獲得對類變量的鎖定,該鎖定將在所有請求中共享,因此您將獲得每個請求的鎖定。

為了獲得預期的行為,請instantiation inside doPost方法instantiation inside移動“對象instantiation inside

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM