Webサーバーがサーブレットを一度インスタンス化してから、このサーブレットへの各リクエストに対してそのメソッドdoGet()
とdoPost()
メソッドを呼び出すことを読みました。このサーブレットへの同時リクエストが100あり、WebサーバーがdoGet()
そのようなリクエストを1つ要求した場合、他の99のリクエストはブロックされます。呼び出されたdoGet()
メソッドは戻りますか?
6 に答える
いいえ、そうではありません。100個の異なるスレッドの同じサーブレットインスタンスでdoGet()を呼び出すだけです。リクエストを処理するアイドルスレッドがない場合、着信リクエストはブロックされます。
いいえ、通常の場合、リクエストごとに新しいスレッドが作成されます。
サーブレットコンテナ内のそれぞれのスレッド数を設定できます。
スレッドをブロックするように設定することもできます。
すべてのリクエストはそれ自体の別のスレッドで処理されるため、ブロックされません。新しいリクエストが来るたびに、コンテナはそれを処理するための新しいスレッドを生成します。
これは、Javaサーブレット仕様3.0がリクエストの処理について述べていることです。
基本Servlet
インターフェースは、クライアント要求を処理するためのサービスメソッドを定義します。このメソッドは、サーブレットコンテナがサーブレットのインスタンスにルーティングするリクエストごとに呼び出されます。Webアプリケーションへの同時リクエストを処理するには、通常、Web Developerが、特定の時間にサービスメソッド内で実行される複数のスレッドを処理できるサーブレットを設計する必要があります。通常、Webコンテナはservlet
、異なるスレッドでサービスメソッドを同時に実行することにより、同じものへの同時リクエストを処理します。
Webサーバーは、各クライアントにサービスを提供するスレッドを生成します。したがって、サーブレットが1つある場合でも、各メソッドはクライアントごとに異なるスレッドによって呼び出されます。
あなたが理解できるように、それはブロックされません。これが、開発者がサーブレットがスレッドセーフであることを確認する責任
がある理由です。
一般に、サーブレットコンテナによって異なります。ただし、ほとんどはマルチスレッドです。複数のスレッドで100回呼び出さdoGet()
れるため、複数のスレッドが同じサーブレットオブジェクトを同時に使用できます。そのため、サーブレットをスレッドセーフにする必要があります。そうしないと、サーブレットは低負荷で動作しているように見えますが、リクエストが増えると不思議なことに崩壊します。
いいえ。
doGetとdoPostが同期されていないためです。
メソッドシグネチャは
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
したがって、他の人がここで言及したマルチスレッドシナリオを処理するのは完全にあなたの責任です。
はい
たとえば、コード実行パスの途中で、doGet()メソッドで次のようにメソッドを呼び出したとします。
doGet(..){
ObjectApple.doRipe() --> ObjectWater.needMoreWater()
}
- ->は、最初のメソッドが他のメソッドを呼び出す/呼び出すことを示します
ObjectWaterの実装では、メンバー変数のような共有リソース(スレッドセーフのために同期する必要があります)があります。もちろん、他の99個のスレッドはすべてブロックされます(ブロックするリソース/データ構造である場合)。