1

staticと の2 つのパラメーターを取るメソッドを持つクラスがHttpServletRequest requestありHttpServletResponse responseます。

public class RequestProcessor {
    public static processRequest(HttpServletRequest request, HttpServletResponse response) {
    //read request and write data to response
    }
}

複数のスレッドが同時に RequestProcessor.processRequest メソッドを呼び出すことができます。

いくつかの調査を行った後、スタックはスレッドに対してローカルであるため問題にならないはずですが、HttpServletRequest リクエストと HttpServletResponse レスポンスは不変ではないため、このコードがまだスレッドセーフであるかどうかはわかりません。

4

3 に答える 3

5

Servletコンテナがどのように機能するかを理解する必要があります。コンテナーはスレッド プールを保持します。リクエストを受け取ると、利用可能なスレッドを選択します。そのスレッド(YMMV)で、オブジェクトを作成 HttpServletRequestHttpServletResponseます。Servlet次に、リクエストを処理するための への参照を取得します。最後に、スレッド内で、以前に作成したおよびオブジェクトServlet#service(..)を渡します。HttpServletRequestHttpServletResponse

メソッドが であるという事実はstatic、違いはありません。現在のスコープ内にあるオブジェクト参照が別の からアクセスできるかどうかを知る必要がありますThread

あなたの例で、パラメーターHttpServletRequestが他の .ThreadprocessRequest

于 2013-10-30T21:14:52.270 に答える
5

はい、メソッドが共有された変更可能な状態を使用/変更しておらず、通常のサーブレット処理内でのみ呼び出す限り、それはまったく問題ありません。したがって、それを呼び出す各スレッドは、それが要求/応答で渡されます。現在取り扱い中。

(複数のスレッドが同じ要求/応答の変更を開始した場合、それは確かに問題を引き起こします。)

于 2013-10-30T21:04:51.070 に答える
0

異なるスレッドから同じオブジェクトを使用してこのメ​​ソッドを呼び出す (およびそれらを変更する) 場合、いいえ、スレッド セーフではありません。

スレッド間でそれらを変更する場合、それらのオブジェクトの周りにロックを追加して、予期しない奇妙な動作が発生しないようにする必要があります。

于 2013-10-30T21:04:34.047 に答える