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