サーブレットスレッドは安全ですか?



Is Servlet Thread Safe

サーブレットはスレッドセーフではありません。

サーブレットがスレッドセーフではない理由を説明するには、サーブレットコンテナ(つまり、Tomcat)がHTTP要求にどのように応答するかを理解する必要があります。



TomcatがクライアントからHTTP要求を受信すると、Tomcatはスレッドプールからスレッドを取得し、要求に対応するサーブレットオブジェクトを見つけて初期化し、service()メソッドを呼び出します。各サーブレットオブジェクトには、Tomcatコンテナ内にシングルトンモードであるインスタンスオブジェクトが1つしかないことに注意してください。複数のHTTPリクエストが同じサーブレットに対するものである場合、2つのHTTPリクエストに対応するスレッドは、サーブレットのservice()メソッドを同時に呼び出します。



上の図のThread1とThread2は、同じServlet1を呼び出すため、 この時点で、インスタンス変数または静的変数がServlet1で定義されている場合、スレッドセーフの問題が発生する可能性があります。 (すべてのスレッドがこれらの変数を使用する可能性があるため)。