新しく質問する

マルチスレッドでのインスタンス変数役に立った:0件

  • 質問者:taiyaki123
  • 投稿日時:2011/01/10 15:39
  • 困り度:困ってます

http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …

このサイトに以下ような趣旨の記述があり、信じられない気持ちでいっぱいです。
「マルチスレッドのケース(たとえばサーブレットでは、)インスタンス変数はヒープ領域に
保持されるので、複数のスレッドからアクセスされるので情報が書き換えられる場合がある」

信じられないのは、インスタンス変数が書き換えられるということです。
サーブレットではインスタンス変数が共有されるのは理解していますが、
サーブレットから呼ばれるインスタンスで定義されているインスタンス変数も
それに該当するのでしょうか。
それとも、サーブレット内だけの話で、サーブレットから呼ばれるインスタンスでは
インスタンス変数は独立していると思ってよいでしょうか。
後者の認識ですが、こういう書き方をされると、サーブレットから呼ばれた先でも
インスタンス変数が共有されると読めて、怖くて仕方ないです。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)
  • 参考になった:0件
  • 回答者:infeeld
  • 回答日時:2011/01/11 00:00

一部不備がありましたので、訂正させて頂きます。

「一方、ローカル変数に格納されたインスタンスは共有されません。」

「一方、ローカル変数は共有されません。」

申し訳ありませんでした。

通報する

  • 参考になった:1件

No.3ベストアンサー20pt

  • 回答者:infeeld
  • 回答日時:2011/01/10 23:52

サーブレットから呼ばれるインスタンスをどの変数に格納するかによります。
サーブレットのインスタンス変数に格納したインスタンスがサーブレットから呼び出されるのであれば、呼び出されたインスタンスのインスタンス変数は共有されます。

これは記事のとおり、ヒープ領域に保持されたインスタンスの参照をたどるためです。

一方、ローカル変数に格納されたインスタンスは共有されません。
ローカル変数はヒープ領域ではなく、スタック領域に保持されるためです。

どうしてもローカル変数を使用する事ができず、インスタンス変数を使用しなければならないのであれば、ThreadLoacl クラスの使用を検討されてみてはいかがでしょうか。

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:salsberry
  • 回答日時:2011/01/10 18:25

> サーブレットから呼ばれるインスタンス

インスタンスを呼ぶことはできないので、質問者さんが何を意図しているのか分かりません。

> このサイトに以下ような趣旨の記述があり、信じられない気持ちでいっぱいです。

どうして信じられないのか分かりませんが、一般論としては全く正しいです。
あるインスタンスのインスタンス変数を書き換えるためにはそのインスタンスへの参照を持っている必要があります。したがって、あるスレッドで生成したインスタンスを他のスレッドから書き換えられないようにするには、そのインスタンスへの参照を他のスレッドに見せなければいいだけです。

通報する

この回答へのお礼

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

  • 参考になった:0件

>サーブレット内だけの話で、サーブレットから呼ばれるインスタンスでは
>インスタンス変数は独立していると思ってよいでしょうか。

どういう意味でしょうか? サーブレットから何かのインスタンスを利用している場合、その中のフィールド(インスタンス変数)はスレッドごとに独立しているか?ということですか。そんなわけはありません。すべてのスレッドでもちろん共有されます。あるいは、そういう意味ではない?

>サーブレットから呼ばれた先でも
>インスタンス変数が共有されると読めて、怖くて仕方ないです。

よくわからないのですが……、なにがどう怖いのでしょう。サーブレットのフィールドが各スレッドで共有されていることは理解されているのですよね……。具体的にどういうことを懸念されているのかがよくわからないのですが。

通報する

この回答へのお礼

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は役に立ちましたか?(役に立った:0件)

このページのトップへ