- - PR -
サーブレットの定義
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-09-24 19:17
サーブレットについて教えていただきたいのですが、
サーブレットはマルチスレッド・シングルインスタンスで動き、スレッドセーフを考えると クラス変数やインスタンス変数は使用できないと聞きましたが、 このときのサーブレットの定義はHttpServletを継承したクラスのみなのでしょうか? それともサーブレット内でインスタンス化されるクラスなども含まれるのでしょうか? たとえば、サーブレット(HttpServletを継承したクラス)内で Hoge hoge1 = new Hoge(); としたHoge1で宣言されるのインスタンス変数もスレッド間で共有されてしまうのでしょうか? どなたかご存知の方がいらっしゃいましたご教授お願いします。 | ||||||||||||
|
投稿日時: 2004-09-24 20:12
「クラス変数やインスタンス変数が使用できない」というのは間違いです。使うのなら マルチスレッドによるアクセスを考慮して使う必要があるだけです。
これはインスタンス変数ですか? ローカル変数ではなくて? インスタンス変数ならもちろん マルチスレッドを意識する必要がありますが、ローカル変数は意識する必要はありません。 | ||||||||||||
|
投稿日時: 2004-09-24 22:54
ukさん返答ありがとうございます。
>これはインスタンス変数ですか? ローカル変数ではなくて? インスタンス変数についてです。 サーブレッド内のメソッドで Hoge hoge1 = new Hoge(); とインスタンスを作成した場合、 Hogeクラスのインスタンス変数は、スレッド間で共有されてしまうということでしょうか? 例えばAさん、Bさんがほぼ同じタイミングでサーブレットにアクセスして、上のHogeクラスのsumというint型のインスタンス変数にAさんが「10」とセットした直後にBさんが「20」とセットした場合、Aさんのスレッドでもsumは20と置き換わるということでしょうか? わかりづらい例えでもうしわけありませんがよろしくお願いします。 | ||||||||||||
|
投稿日時: 2004-09-24 22:59
インスタンス変数ってどういう意味で使っています? 普通はクラスのトップレベルで宣言されているフィールドのことを呼ぶとおもうのですが。 doGetやdoPostメソッド内で宣言された変数はローカル変数ですよ? | ||||||||||||
|
投稿日時: 2004-09-24 23:17
mogeさん返答ありがとうございます。
具体的にいいますと、 サーブレット内のメソッドで下のMenuProcのインスタンスを作成して、「szMode」に値をセットしています。 public class MenuProc { private String szMode; public void init(HttpServletRequest req,HttpServletResponse res) throws Exception{ try{ szMode = this.getParameter("Mode"); 以下省略 このとき、szModeの値はスレッド間で共有されてしまうと同時アクセスの時に処理がうまくいかなくなってしまうのではと思って質問をさせていただいたのですが。 本当にわかりづらくてすいません。 | ||||||||||||
|
投稿日時: 2004-09-24 23:27
本気で回答がほしいなら情報を小出しにしないで全部コードを載せたほうがいいと思いますが。
このクラス自体はスレッドセーフを考慮してないのでサーブレットのインスタンス変数にしたら当然おかしな動きをすると思いますよ。 [追記] サーブレットのメソッド内で宣言するならば(つまりサーブレットのローカル変数であるのならば)このクラスのオブジェクトはその都度生成されるのでszModeの値は共有されませんよ。 [/追記] [ メッセージ編集済み 編集者: moge 編集日時 2004-09-24 23:31 ] | ||||||||||||
|
投稿日時: 2004-09-25 00:18
mogeさん返答ありがとうございます。
>本気で回答がほしいなら情報を小出しにしないで全部コードを載せたほうがいいと思い>ますが。 そう思ったのですが、コードが結構長いので例題程度に載せてしましました。 長くてもすべて出したほうがいいのですかね? >[追記] >サーブレットのメソッド内で宣言するならば(つまりサーブレットのローカル変数であ>るのならば)このクラスのオブジェクトはその都度生成されるのでszModeの値は共有さ>れませんよ。 ということはサーブレットのメソッドで作成されるMenuProcのインスタンス内で 宣言されるインスタンス変数も共有されないということではないのですか? MenuProc mp = new MenuProc(); サーブレットのメソッドで上のようにMenuProcクラス型の変数mpはローカル変数ですよね?間違っていたらすいません。 | ||||||||||||
|
投稿日時: 2004-09-25 00:53
もちろん、常識内で、と言う事ですね。 # 昔全盛を誇っていた某MLで考えなしにソースを貼ろうものなら。。。(^^;
こんな感じですかね。(間違ってたらすみません。っいうか恥ずかしい)
# コード記述漏れ修正 [ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-09-25 00:55 ] [ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-09-25 00:55 ] |
1|2|3
次のページへ»