1

サーブレットを定義 (/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();
        }
    }

最初のリクエストが来ると、「開始」を出力してから待機し、2番目のリクエストが来ると、思ったlock.wait(15000); ようにブロックされるはずです。synchronized(lock);しかし、実際には、2 番目の要求はdoPostメソッドからブロックされています。最初のリクエストがlock.notifyAll();送信された後、2 番目のリクエストがdoPostメソッドに入り、'start' を出力します。

これは、2 つのリクエストがまったく同じ URL をクエリした場合にのみ発生することがわかりました。これは、Tomcat がマルチスレッドを処理する方法ですか?? 私はとても混乱しています..

4

1 に答える 1

0

doPostサーブレットのandメソッドのみdoGetがスレッドセーフです。つまり、スレッドごとに独立して呼び出されます。クラス自体は1回だけインスタンス化されます。
上記のコードでは、すべてのリクエストで共有されるクラス変数のロックを取得しているため、リクエストごとにロックされています。

期待される動作を得るには、' instantiation insideObjectdoPost`メソッドを移動します。

于 2013-02-25T08:56:09.117 に答える