- ベストアンサー
servletのマルチスレッドとはどこまで意識をする必要があるのか?
「servletはマルチスレッドを意識して実装しなくてはいけない」とよく聞きます。 マルチスレッドを意識しなければならないのは、HttpServletを継承したクラスのみなのでしょうか? それとも、そこからインスタンス化される汎用クラスなどもマルチスレッドを意識し、インスタンス変数は悪とされるのでしょうか? となると、汎用クラスのコンストラクタ引数に値を渡し汎用クラス内でインスタンス変数を使用するってコーディングは完全なNGになりますよね。 HttpServlet継承のサーブレットからインスタンス化されれば、都度個別のメモリが割り当てられると思うのですが・・。 ご存知な方いらっしゃいましたらご教授お願いいたします。 以上
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> (1)サーブレットとして動く全てのクラスを現しているのでしょうか? > (たとえば、Strutsなどで動く個別アクションモジュールも含めるのか、の意です) HttpServlet、Actionクラスです。 > (2)それともHttpServletを継承したクラスのことでしょうか? > (インスタンス化される個別アクションモジュールは含まない) Strutsの場合、Actionクラスを継承したクラスも初めて実行された時にインスタンス化されコンテナに常駐されます。以降の実行はこのインスタンスのスレッドとして実行されます。よってservletのインスタンス変数は共有されるので意識しないといけません。 ・・回答になっているでしょうか?
その他の回答 (2)
- Harry_
- ベストアンサー率55% (36/65)
まず、クライアントからのひとつひとつのリクエストが スレッドとして実行される、ということを理解するべき だと思います。 サーブレット内で new したオブジェクトは、 各リクエストごとに生成されますから、 スレッドを意識する必要はないのですが、 このオブジェクトをアプリケーションスコープなどに 格納し、任意のリクエストがそれにアクセス可能と なるようなコードを書けば、そのオブジェクトのクラスは スレッドセーフに作成しなければならなくなります。
- Struts
- ベストアンサー率48% (29/60)
servletは初めて実行された時にインスタンス化されコンテナに常駐されます。以降の実行はこのインスタンスのスレッドとして実行されます。よってservletのインスタンス変数は共有されるので意識しないといけません。 ただし、servletのメソッド内はローカルなのでbean等のスコープはそのメソッド内で完結します。
補足
早速のご回答ありがとうございます。 重ねて質問になりますが、Strutsさんがおっしゃる「servlet」の定義は (1)サーブレットとして動く全てのクラスを現しているのでしょうか? (たとえば、Strutsなどで動く個別アクションモジュールも含めるのか、の意です) (2)それともHttpServletを継承したクラスのことでしょうか? (インスタンス化される個別アクションモジュールは含まない) お手数ですがお教えください。