• ベストアンサー

Servletにおけるスレッド間でのグローバル変数の関係

お世話になっております。 サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、 それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか? グローバル変数を有するサーブレットクラスを作成し、2つのスレッドを流したところ、1つ目のスレッドでセットした値が、後追いで流した2つ目のスレッドでセットした値に置き換わってしまいました。 それぞれの値を関連性の無いようにしたいのですが どのようにしたら良いのか、ご存知の方いらっしゃいましたらご教授願います。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.3

その他の方法では SingleThreadModelを実装する。 このパターンですと リクエストごとにインスタンスを 生成するようになります。 方法は public class Sample extend HttpServlet     implements SingleThreadModel { です。

kawakami2005
質問者

お礼

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

その他の回答 (3)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

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

kawakami2005
質問者

お礼

ご回答ありがとうございます。 Javaに関する根本的な部分での理解が不足していました。 大変貴重なご意見ありがとうございます。 今回ご回答いただいた皆様にポイントを割り振りたいところなのですが、2名までということで申し訳ないです。

noname#18558
noname#18558
回答No.2

ThreadLocalとは、java.lang.Threadクラスのことです。 メソッドのローカル変数のことではございません。 Thread単位で値を管理することができます。 詳しくは、JavaDocをご覧下さい。 Sessionとは、javax.servlet.http.HttpSessionクラスのことです。 サーブレットでは常識なので検索でも参考書でもすればすぐに見つかると思います。

kawakami2005
質問者

お礼

ご丁寧に説明いただき大変助かりました。 ありがとうございます。 もっと勉強しなければと痛感いたしました。

noname#18558
noname#18558
回答No.1

まず、Javaにはグローバル変数というのはありません。 おそらく、インスタンス変数のことでしょうか。 アプリケーションサーバーによって異なりますが、 サーブレットインスタンスは、複数スレッドで共有されます。 したがって、その処理は正しい動きです。 一般的に、サーブレットクラスにインスタンス変数を持たないのは常套です。 スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。

kawakami2005
質問者

補足

大変参考になるご意見 ありがとうございます。 つきましては、お恥ずかしながら 重ねて質問させていただきたいのですが > スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。 「ThreadLocalの変数」というのは メソッド毎にローカル変数を定義するという認識で間違いないでしょうか? また「Session」というのが具体的にどういうことでしょうか。 もしお時間に余裕がございましたら、ご教授いただければ幸いです。 よろしくお願い致します。

関連するQ&A