お世話になっております。
サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、
それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか?
グローバル変数を有するサーブレットクラスを作成し、2つのスレッドを流したところ、1つ目のスレッドでセットした値が、後追いで流した2つ目のスレッドでセットした値に置き換わってしまいました。
それぞれの値を関連性の無いようにしたいのですが
どのようにしたら良いのか、ご存知の方いらっしゃいましたらご教授願います。
宜しくお願い致します。
No.4
- 回答日時:
がると申します。
割合に典型的な「threadアンセーフなバグ」かと思われます。threadの概念は確かに若干面倒なのですが、Javaでサーブレットをやるのであれば、習得はMustになります。
まずは言語云々以前に「thread」と、「thread safeな実装」について学ばれるとよろしいかと。
そうですねぇ。一つヒントとしては「processとthreadはどこがどう違うのか? なぜ双方が発生したのか? 特に、メモリ保護の観点から。」という問いに正しく答えられるようになると、大分違うかと思われます。
googleあたりを調べられると、色々と出てくると思いますので。
ご回答ありがとうございます。
Javaに関する根本的な部分での理解が不足していました。
大変貴重なご意見ありがとうございます。
今回ご回答いただいた皆様にポイントを割り振りたいところなのですが、2名までということで申し訳ないです。
No.3ベストアンサー
- 回答日時:
その他の方法では
SingleThreadModelを実装する。
このパターンですと
リクエストごとにインスタンスを
生成するようになります。
方法は
public class Sample extend HttpServlet
implements SingleThreadModel {
です。
ありがとうございます。
今回の場合、こちらの方法が一番修正箇所が少なくなりそうなので、
こちらの方法を取らせていただく事にしました。
貴重なご意見ありがとうございました。
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で質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CPU・メモリ・マザーボード インテルCPUの世代ごとのデスクトップとノートのコア数についてこれで正しいですか?(*´ω`*) 1 2023/01/07 14:44
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- デスクトップパソコン デスクトップpcを買います。 値段が妥当か見てください。 PC基本部 ESPRIMO WD2/F3 4 2022/05/14 06:58
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
変数名の付け方
-
生成したインスタンスを削除す...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
-
複数の変数を宣言する時、同時...
-
[Visual C#] 優先される処理に...
-
サーブレットでレスポンスが返...
-
インスタンスを同じ名前で作成...
-
文字列を日付に変換でParseExce...
-
エクセル(複数インスタンス)...
-
サーブレットのスレッド管理に...
-
C#のスレッド処理について、ご...
-
MDIでフォームがアクティブにな...
-
VB6.0で、DLLを動的に参照したい
-
インスタンス生成で、○○.xxx();...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
おすすめ情報