プロが教える店舗&オフィスのセキュリティ対策術

「servletはマルチスレッドを意識して実装しなくてはいけない」とよく聞きます。

マルチスレッドを意識しなければならないのは、HttpServletを継承したクラスのみなのでしょうか?

それとも、そこからインスタンス化される汎用クラスなどもマルチスレッドを意識し、インスタンス変数は悪とされるのでしょうか?

となると、汎用クラスのコンストラクタ引数に値を渡し汎用クラス内でインスタンス変数を使用するってコーディングは完全なNGになりますよね。

HttpServlet継承のサーブレットからインスタンス化されれば、都度個別のメモリが割り当てられると思うのですが・・。

ご存知な方いらっしゃいましたらご教授お願いいたします。

以上

A 回答 (3件)

> (1)サーブレットとして動く全てのクラスを現しているのでしょうか?


> (たとえば、Strutsなどで動く個別アクションモジュールも含めるのか、の意です)

HttpServlet、Actionクラスです。

> (2)それともHttpServletを継承したクラスのことでしょうか?
> (インスタンス化される個別アクションモジュールは含まない)

Strutsの場合、Actionクラスを継承したクラスも初めて実行された時にインスタンス化されコンテナに常駐されます。以降の実行はこのインスタンスのスレッドとして実行されます。よってservletのインスタンス変数は共有されるので意識しないといけません。

・・回答になっているでしょうか?
    • good
    • 0

まず、クライアントからのひとつひとつのリクエストが


スレッドとして実行される、ということを理解するべき
だと思います。

サーブレット内で new したオブジェクトは、
各リクエストごとに生成されますから、
スレッドを意識する必要はないのですが、

このオブジェクトをアプリケーションスコープなどに
格納し、任意のリクエストがそれにアクセス可能と
なるようなコードを書けば、そのオブジェクトのクラスは
スレッドセーフに作成しなければならなくなります。
    • good
    • 0

servletは初めて実行された時にインスタンス化されコンテナに常駐されます。

以降の実行はこのインスタンスのスレッドとして実行されます。よってservletのインスタンス変数は共有されるので意識しないといけません。
ただし、servletのメソッド内はローカルなのでbean等のスコープはそのメソッド内で完結します。

この回答への補足

早速のご回答ありがとうございます。

重ねて質問になりますが、Strutsさんがおっしゃる「servlet」の定義は

(1)サーブレットとして動く全てのクラスを現しているのでしょうか?
(たとえば、Strutsなどで動く個別アクションモジュールも含めるのか、の意です)

(2)それともHttpServletを継承したクラスのことでしょうか?
(インスタンス化される個別アクションモジュールは含まない)

お手数ですがお教えください。

補足日時:2004/02/09 14:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!