お世話になっております。
サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、
それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか?
グローバル変数を有するサーブレットクラスを作成し、2つのスレッドを流したところ、1つ目のスレッドでセットした値が、後追いで流した2つ目のスレッドでセットした値に置き換わってしまいました。
それぞれの値を関連性の無いようにしたいのですが
どのようにしたら良いのか、ご存知の方いらっしゃいましたらご教授願います。
宜しくお願い致します。
No.4
- 回答日時:
がると申します。
割合に典型的な「threadアンセーフなバグ」かと思われます。threadの概念は確かに若干面倒なのですが、Javaでサーブレットをやるのであれば、習得はMustになります。
まずは言語云々以前に「thread」と、「thread safeな実装」について学ばれるとよろしいかと。
そうですねぇ。一つヒントとしては「processとthreadはどこがどう違うのか? なぜ双方が発生したのか? 特に、メモリ保護の観点から。」という問いに正しく答えられるようになると、大分違うかと思われます。
googleあたりを調べられると、色々と出てくると思いますので。
ご回答ありがとうございます。
Javaに関する根本的な部分での理解が不足していました。
大変貴重なご意見ありがとうございます。
今回ご回答いただいた皆様にポイントを割り振りたいところなのですが、2名までということで申し訳ないです。
No.2
- 回答日時:
ThreadLocalとは、java.lang.Threadクラスのことです。
メソッドのローカル変数のことではございません。
Thread単位で値を管理することができます。
詳しくは、JavaDocをご覧下さい。
Sessionとは、javax.servlet.http.HttpSessionクラスのことです。
サーブレットでは常識なので検索でも参考書でもすればすぐに見つかると思います。
No.1
- 回答日時:
まず、Javaにはグローバル変数というのはありません。
おそらく、インスタンス変数のことでしょうか。
アプリケーションサーバーによって異なりますが、
サーブレットインスタンスは、複数スレッドで共有されます。
したがって、その処理は正しい動きです。
一般的に、サーブレットクラスにインスタンス変数を持たないのは常套です。
スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。
この回答への補足
大変参考になるご意見
ありがとうございます。
つきましては、お恥ずかしながら
重ねて質問させていただきたいのですが
> スレッドごとに別の値を持ちたい場合は、多くの場合ThreadLocalの変数か、Sessionにしたりします。
「ThreadLocalの変数」というのは
メソッド毎にローカル変数を定義するという認識で間違いないでしょうか?
また「Session」というのが具体的にどういうことでしょうか。
もしお時間に余裕がございましたら、ご教授いただければ幸いです。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
private static という変数の修飾
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
オブジェクト参照がオブジェク...
-
複数の変数を宣言する時、同時...
-
C# インスタンスの破棄
-
VB.NET getとsetの概念がわかり...
-
「インスタンス」の意味をわか...
-
生成したインスタンスを削除す...
-
メソッドの引数としてのthisの意味
-
C#の構造体の開放のしかた
-
newしないインスタンス?実体化...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
javaのクラスの作り方、エラー...
-
vb.netでFAXを送信する方法
-
JavaのJButton、JLabel(画像)の...
-
SQLを連続発行する時の正しい(?...
-
C#において、同じインスタンス...
-
【java】コンストラクタの処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
オブジェクト参照がオブジェク...
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
変数の参照でエラーが出てしま...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
文字列を日付に変換でParseExce...
-
javaのクラスの作り方、エラー...
-
フォームの存在をチェックする方法
-
newしないインスタンス?実体化...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
-
他のファイルの変数参照
-
VB6.0で、DLLを動的に参照したい
おすすめ情報