3

Javaがどのように深く機能するかを理解したいと思います。すべてのチュートリアルのレベルが高すぎるため、いくつか質問があります。

  1. このコードを考えると:

    class Example {
      public void foo() {
        int number = getRandomNumber();
        System.out.println(number); 
      }
    }
    

    foo()上記の例では、複数のスレッドからメソッドにアクセスできると仮定します。すべてのスレッドには変数の独自の正しい値がありnumberますか、それとも 2 番目のスレッドが最初のスレッドの値を変更することは可能ですか (そのため、両方とも同じ値を出力します)。

  2. int numberファイナルだったらどうなる?

私が知りたい主なことは、いくつかの初期化 (接続など) があるときに、スレッドが互いに干渉しないようにしたいということです。

4

8 に答える 8

6

すべてのスレッドには独自の数値変数の正しい値がありますか、または 2 番目のスレッドが最初のスレッドの値を変更することは可能ですか (そのため、両方とも同じ値を出力します)。

のすべてのメソッド呼び出しfooは独自の変数があると考える方が明確numberです。これはメソッド内のローカル変数です。したがって、これがどういうわけか再帰的なメソッドである場合、メソッドの呼び出しが異なるため、単一のスレッドでもnumber同時に複数の変数になる可能性があります。

他のスレッドがローカル変数の値を変更することはできません。また、他のコード内で 1 つの呼び出しの値を変更することもできません。それはその呼び出しの状態の一部です。

int 番号が final だったらどうなりますか?

これにより、基本的に、初期化後に変数の値を変更できなくなります。

于 2013-04-16T10:17:57.750 に答える
2

メソッド内のすべてのローカル メンバーはスタック上にあるため、各メソッドには独自の数値変数のコピーがあります。

number が final だった場合でも、各スレッドには独自の number のコピーがあります。final を宣言すると、この変数が変更されないことがコンパイラに通知されるため、コンパイラは自分の側で最適化を行うことができます。

于 2013-04-16T10:16:48.607 に答える
1

に関する両方の質問への回答としてnumber-各スレッドには独自の変数があります-スレッドは、それがあったかどうかに関係なく、他のスレッドのローカル変数を変更できfinalません。

すべてのローカル変数は一意です。メソッドを呼び出すスレッドごとにスタックにコピーがあります。

于 2013-04-16T10:16:40.870 に答える
1

サンプルコード通り

  1. メソッド コンテキスト スレッドでは、同時にアクセスするfoo()と、メソッドを実行するための独自のスタックが作成されますfoo()。ローカル変数は共有されません。

  2. 同時アクセスに関する限り、何も問題はありません。それを final にすることで、内部のfoo()メソッド番号の値が更新されないことが保証されます。

オブジェクトまたは静的変数が複数のスレッドで共有されている場合、同時実行のシナリオが発生し、スレッドが干渉する可能性があります。

以下では、クラス XYZ のオブジェクトが 2 つのスレッドで共有されている場合、1 つのスレッドによって更新された数値が 2 番目のスレッドによって出力される可能性があります。

 class XYZ {
static int number = 0;
  public void foo() {
    number = getRandomNumber();
    System.out.println(number); 
  }
}
于 2013-04-16T10:22:59.103 に答える
1

各スレッドには独自のコール スタックがあります。

その呼び出しスタックには、スタック フレームがあります。メソッド呼び出しごとに 1 つ。

そのスタック フレーム内には、ローカル変数があります (とりわけ)。

そうです、fooメソッドのすべての呼び出しには独自のnumber変数があります。

ローカル変数を持ってfinalいても、それは根本的に変わりません。

于 2013-04-16T10:17:26.847 に答える