11

重複の可能性:
サーブレットはどのように機能しますか?インスタンス化、セッション変数、マルチスレッド

サーブレットはスレッドセーフですか..?たとえば、5つの異なるブラウザを開いて、コンテナ内の1つのサーブレットにリクエストを送信した場合、それでもスレッドセーフですか、私はservice()特別にメソッドを意味します

4

1 に答える 1

32

あなたの質問は次のように要約されます。同じオブジェクト上の複数のスレッドからメソッドを呼び出しています thread safe。答えは、場合によって異なります。オブジェクト (サーブレットとします) がステートレスであるかfinal、フィールドしかない場合、これは完全にスレッド セーフです。ローカル変数とパラメーターはスレッドに対してローカルです (ヒープではなくスタックに存在します)。

また、各service()呼び出しは と の個別のインスタンスを受け取りServletRequestますServletResponse。ただし、安全でないサーブレットの例を次に示します。

public class UnsafeServlet implements Servlet {

    private int counter;

    public void init(ServletConfig config) throws ServletException {
    }

    public void service(ServletRequest request, ServletResponse response)
        ++counter;
    }

    public void destroy() {
    }

}

counter複数のスレッドが変数にアクセスできるため、何らかの方法で保護する必要があります: synchronized(を使用volatileするだけでは十分ではありません):

synchronized(this) {
    ++counter;
}

またはAtomicInteger:

private AtomicInteger counter = new AtomicInteger();

//...
counter.incrementAndGet();

この特定のケースでは、ミューテックスであるAtomicInteger間は CAS CPU 操作を使用してロックフリーであるため、はるかに優れています。synchronized

于 2012-07-14T16:47:17.180 に答える