• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マルチスレッドでのインスタンス変数)

マルチスレッドでのインスタンス変数

このQ&Aのポイント
  • マルチスレッド環境でのインスタンス変数の問題について、サーブレットに関連して議論されています。
  • サーブレット内で呼ばれるインスタンスでもインスタンス変数が共有される可能性があり、これが不安要素です。
  • インスタンス変数はヒープ領域に保持されるため、複数のスレッドからアクセスされると書き換えられる可能性があると言われています。

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

  • ベストアンサー
  • infeeld
  • ベストアンサー率37% (3/8)
回答No.3

サーブレットから呼ばれるインスタンスをどの変数に格納するかによります。 サーブレットのインスタンス変数に格納したインスタンスがサーブレットから呼び出されるのであれば、呼び出されたインスタンスのインスタンス変数は共有されます。 これは記事のとおり、ヒープ領域に保持されたインスタンスの参照をたどるためです。 一方、ローカル変数に格納されたインスタンスは共有されません。 ローカル変数はヒープ領域ではなく、スタック領域に保持されるためです。 どうしてもローカル変数を使用する事ができず、インスタンス変数を使用しなければならないのであれば、ThreadLoacl クラスの使用を検討されてみてはいかがでしょうか。

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/ThreadLocal.html
taiyaki123
質問者

お礼

やはりそうでしたか。 ありがとうございました。

その他の回答 (3)

  • infeeld
  • ベストアンサー率37% (3/8)
回答No.4

一部不備がありましたので、訂正させて頂きます。 「一方、ローカル変数に格納されたインスタンスは共有されません。」 ↓ 「一方、ローカル変数は共有されません。」 申し訳ありませんでした。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> サーブレットから呼ばれるインスタンス インスタンスを呼ぶことはできないので、質問者さんが何を意図しているのか分かりません。 > このサイトに以下ような趣旨の記述があり、信じられない気持ちでいっぱいです。 どうして信じられないのか分かりませんが、一般論としては全く正しいです。 あるインスタンスのインスタンス変数を書き換えるためにはそのインスタンスへの参照を持っている必要があります。したがって、あるスレッドで生成したインスタンスを他のスレッドから書き換えられないようにするには、そのインスタンスへの参照を他のスレッドに見せなければいいだけです。

taiyaki123
質問者

お礼

まったくもって間違った回答ですね。 サーブレットからインスタンスを呼ぶことができないなんて・・・。

noname#161640
noname#161640
回答No.1

>サーブレット内だけの話で、サーブレットから呼ばれるインスタンスでは >インスタンス変数は独立していると思ってよいでしょうか。 どういう意味でしょうか? サーブレットから何かのインスタンスを利用している場合、その中のフィールド(インスタンス変数)はスレッドごとに独立しているか?ということですか。そんなわけはありません。すべてのスレッドでもちろん共有されます。あるいは、そういう意味ではない? >サーブレットから呼ばれた先でも >インスタンス変数が共有されると読めて、怖くて仕方ないです。 よくわからないのですが……、なにがどう怖いのでしょう。サーブレットのフィールドが各スレッドで共有されていることは理解されているのですよね……。具体的にどういうことを懸念されているのかがよくわからないのですが。

taiyaki123
質問者

お礼

No3の方の回答がやはり正のような気がします。 自分でPGを書いてテストしても、No3の方のようになります。 ですので、以下の回答は間違いですね。 >サーブレットから何かのインスタンスを利用している場合、その中のフィールド(インスタンス変数) >はスレッドごとに独立しているか?ということですか。そんなわけはありません。すべてのスレッドで >もちろん共有されます。 念のため質問内容が分かるようなソースをつけます。 SampleClassで定義されているメンバー変数(staticではない変数)が、 スレッド毎に共有されるかという質問です。 servletclass extends HttpServet{   public int a = 0; public void doPost(){ SampleClass sc = new SampleClass(); } } SampleClass{ public int x = 0; } このようなプログラムがあったとします。 このプログラムを複数の人が、同時にアクセスした場合に、 SampleClassで定義されているメンバー変数のxが共有されるかという意味です。 もちろん、共有されないという認識です。

関連するQ&A

専門家に質問してみよう