- PR -

サーブレットの定義

投稿者投稿内容
来夏
会議室デビュー日: 2004/09/24
投稿数: 11
投稿日時: 2004-09-24 19:17
サーブレットについて教えていただきたいのですが、
サーブレットはマルチスレッド・シングルインスタンスで動き、スレッドセーフを考えると
クラス変数やインスタンス変数は使用できないと聞きましたが、
このときのサーブレットの定義はHttpServletを継承したクラスのみなのでしょうか?
それともサーブレット内でインスタンス化されるクラスなども含まれるのでしょうか?
たとえば、サーブレット(HttpServletを継承したクラス)内で

Hoge hoge1 = new Hoge();

としたHoge1で宣言されるのインスタンス変数もスレッド間で共有されてしまうのでしょうか?
どなたかご存知の方がいらっしゃいましたご教授お願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 20:12
引用:

来夏さんの書き込み (2004-09-24 19:17) より:
サーブレットについて教えていただきたいのですが、
サーブレットはマルチスレッド・シングルインスタンスで動き、スレッドセーフを考えると
クラス変数やインスタンス変数は使用できないと聞きましたが、
このときのサーブレットの定義はHttpServletを継承したクラスのみなのでしょうか?


「クラス変数やインスタンス変数が使用できない」というのは間違いです。使うのなら
マルチスレッドによるアクセスを考慮して使う必要があるだけです。

引用:

それともサーブレット内でインスタンス化されるクラスなども含まれるのでしょうか?
たとえば、サーブレット(HttpServletを継承したクラス)内で

Hoge hoge1 = new Hoge();

としたHoge1で宣言されるのインスタンス変数もスレッド間で共有されてしまうのでしょうか?
どなたかご存知の方がいらっしゃいましたご教授お願いします。


これはインスタンス変数ですか? ローカル変数ではなくて? インスタンス変数ならもちろん
マルチスレッドを意識する必要がありますが、ローカル変数は意識する必要はありません。
来夏
会議室デビュー日: 2004/09/24
投稿数: 11
投稿日時: 2004-09-24 22:54
ukさん返答ありがとうございます。

>これはインスタンス変数ですか? ローカル変数ではなくて?

インスタンス変数についてです。
サーブレッド内のメソッドで
Hoge hoge1 = new Hoge();
とインスタンスを作成した場合、
Hogeクラスのインスタンス変数は、スレッド間で共有されてしまうということでしょうか?
例えばAさん、Bさんがほぼ同じタイミングでサーブレットにアクセスして、上のHogeクラスのsumというint型のインスタンス変数にAさんが「10」とセットした直後にBさんが「20」とセットした場合、Aさんのスレッドでもsumは20と置き換わるということでしょうか?
わかりづらい例えでもうしわけありませんがよろしくお願いします。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2004-09-24 22:59
引用:

インスタンス変数についてです。
サーブレッド内のメソッドで
Hoge hoge1 = new Hoge();
とインスタンスを作成した場合、
Hogeクラスのインスタンス変数は、スレッド間で共有されてしまうということでしょうか?


インスタンス変数ってどういう意味で使っています?
普通はクラスのトップレベルで宣言されているフィールドのことを呼ぶとおもうのですが。

doGetやdoPostメソッド内で宣言された変数はローカル変数ですよ?
来夏
会議室デビュー日: 2004/09/24
投稿数: 11
投稿日時: 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の値はスレッド間で共有されてしまうと同時アクセスの時に処理がうまくいかなくなってしまうのではと思って質問をさせていただいたのですが。

本当にわかりづらくてすいません。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2004-09-24 23:27
本気で回答がほしいなら情報を小出しにしないで全部コードを載せたほうがいいと思いますが。
引用:

public class MenuProc {
 private String szMode;
 public void init(HttpServletRequest req,HttpServletResponse res) throws Exception{
  try{
szMode = this.getParameter("Mode");


このクラス自体はスレッドセーフを考慮してないのでサーブレットのインスタンス変数にしたら当然おかしな動きをすると思いますよ。

[追記]
サーブレットのメソッド内で宣言するならば(つまりサーブレットのローカル変数であるのならば)このクラスのオブジェクトはその都度生成されるのでszModeの値は共有されませんよ。
[/追記]


[ メッセージ編集済み 編集者: moge 編集日時 2004-09-24 23:31 ]
来夏
会議室デビュー日: 2004/09/24
投稿数: 11
投稿日時: 2004-09-25 00:18
mogeさん返答ありがとうございます。

>本気で回答がほしいなら情報を小出しにしないで全部コードを載せたほうがいいと思い>ますが。
そう思ったのですが、コードが結構長いので例題程度に載せてしましました。
長くてもすべて出したほうがいいのですかね?

>[追記]
>サーブレットのメソッド内で宣言するならば(つまりサーブレットのローカル変数であ>るのならば)このクラスのオブジェクトはその都度生成されるのでszModeの値は共有さ>れませんよ。

ということはサーブレットのメソッドで作成されるMenuProcのインスタンス内で
宣言されるインスタンス変数も共有されないということではないのですか?
MenuProc mp = new MenuProc();
サーブレットのメソッドで上のようにMenuProcクラス型の変数mpはローカル変数ですよね?間違っていたらすいません。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-09-25 00:53
引用:

来夏さんの書き込み (2004-09-25 00:18) より:
長くてもすべて出したほうがいいのですかね?


もちろん、常識内で、と言う事ですね。
# 昔全盛を誇っていた某MLで考えなしにソースを貼ろうものなら。。。(^^;

引用:

>[追記]
ということはサーブレットのメソッドで作成されるMenuProcのインスタンス内で
宣言されるインスタンス変数も共有されないということではないのですか?
MenuProc mp = new MenuProc();
サーブレットのメソッドで上のようにMenuProcクラス型の変数mpはローカル変数ですよね?間違っていたらすいません。



こんな感じですかね。(間違ってたらすみません。っいうか恥ずかしい)
コード:


public class HogeServlet extends HttpServlet {
private String a; // 共有される
private static String b; // 共有される

public void init(HttpServletRequest req,HttpServletResponse res) throws Exception{
String c = ...; // 共有されない
Moge moge = new Moge(); // 共有されない
}
}

class Moge {
private String d; // 共有されない
private static String e; // 共有される
}



# コード記述漏れ修正

[ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-09-25 00:55 ]

[ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-09-25 00:55 ]

スキルアップ/キャリアアップ(JOB@IT)