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

お世話になっております。

サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、
それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか?

グローバル変数を有するサーブレットクラスを作成し、2つのスレッドを流したところ、1つ目のスレッドでセットした値が、後追いで流した2つ目のスレッドでセットした値に置き換わってしまいました。

それぞれの値を関連性の無いようにしたいのですが
どのようにしたら良いのか、ご存知の方いらっしゃいましたらご教授願います。

宜しくお願い致します。

A 回答 (4件)

がると申します。

割合に典型的な「threadアンセーフなバグ」かと思われます。
threadの概念は確かに若干面倒なのですが、Javaでサーブレットをやるのであれば、習得はMustになります。
まずは言語云々以前に「thread」と、「thread safeな実装」について学ばれるとよろしいかと。
そうですねぇ。一つヒントとしては「processとthreadはどこがどう違うのか? なぜ双方が発生したのか? 特に、メモリ保護の観点から。」という問いに正しく答えられるようになると、大分違うかと思われます。
googleあたりを調べられると、色々と出てくると思いますので。
    • good
    • 1
この回答へのお礼

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

Javaに関する根本的な部分での理解が不足していました。

大変貴重なご意見ありがとうございます。

今回ご回答いただいた皆様にポイントを割り振りたいところなのですが、2名までということで申し訳ないです。

お礼日時:2006/05/24 13:00

その他の方法では


SingleThreadModelを実装する。

このパターンですと
リクエストごとにインスタンスを
生成するようになります。

方法は
public class Sample extend HttpServlet
    implements SingleThreadModel {
です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

今回の場合、こちらの方法が一番修正箇所が少なくなりそうなので、
こちらの方法を取らせていただく事にしました。

貴重なご意見ありがとうございました。

お礼日時:2006/05/24 12:57

ThreadLocalとは、java.lang.Threadクラスのことです。


メソッドのローカル変数のことではございません。
Thread単位で値を管理することができます。
詳しくは、JavaDocをご覧下さい。

Sessionとは、javax.servlet.http.HttpSessionクラスのことです。
サーブレットでは常識なので検索でも参考書でもすればすぐに見つかると思います。
    • good
    • 0
この回答へのお礼

ご丁寧に説明いただき大変助かりました。
ありがとうございます。

もっと勉強しなければと痛感いたしました。

お礼日時:2006/05/24 12:44

まず、Javaにはグローバル変数というのはありません。



おそらく、インスタンス変数のことでしょうか。

アプリケーションサーバーによって異なりますが、
サーブレットインスタンスは、複数スレッドで共有されます。
したがって、その処理は正しい動きです。

一般的に、サーブレットクラスにインスタンス変数を持たないのは常套です。

スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。

この回答への補足

大変参考になるご意見
ありがとうございます。

つきましては、お恥ずかしながら
重ねて質問させていただきたいのですが

> スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。


「ThreadLocalの変数」というのは
メソッド毎にローカル変数を定義するという認識で間違いないでしょうか?

また「Session」というのが具体的にどういうことでしょうか。

もしお時間に余裕がございましたら、ご教授いただければ幸いです。
よろしくお願い致します。

補足日時:2006/05/23 18:07
    • good
    • 0

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