
お世話になっております。
サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、
それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか?
グローバル変数を有するサーブレットクラスを作成し、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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
C#において、同じインスタンス...
-
インスタンス参照でアクセスで...
-
クラスのインスタンス名をクラ...
-
フォームのCheck boxとOLEObjec...
-
C# インスタンスの破棄
-
C#の構造体の開放のしかた
-
JSPでの表示
-
SQLを連続発行する時の正しい(?...
-
Eclipse3でVisualEditorが起動...
-
VB.NET Newしたものを変数に代...
-
VB.NET getとsetの概念がわかり...
-
[VB.NET] インスタンス生成とイ...
-
エクセル(複数インスタンス)...
-
objective-cで分かりにくい所教...
-
「インスタンス」の意味をわか...
-
「タイプ初期化子が例外をスロ...
-
中学のクラス数
-
eclipse-Tomcatでのデバッグに...
-
【sendkeysメソッドが動かずに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
複数の変数を宣言する時、同時...
-
オブジェクト参照がオブジェク...
-
VB.NET getとsetの概念がわかり...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
C# インスタンスの破棄
-
生成したインスタンスを削除す...
-
文字列を日付に変換でParseExce...
-
次の日本語の意味を教えて下さい
-
C#「オブジェクト参照が必要で...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
newしないインスタンス?実体化...
-
C#の構造体の開放のしかた
-
javaのクラスの作り方、エラー...
おすすめ情報