2017-02-23 17 views
1

次のように私は方法がある:競合状態

public static void method() { 

int i = 0; 
i = i + 1; 

} 

私は静的メソッド内のint変数を有します。メソッドにはいくつかのスレッドがアクセスします。
私の質問は以下のとおりです。

  1. は、条件をレースにi変数行くしていますか?
  2. メソッドがSpring Webアプリケーションでアクセスされ、複数のユーザーが同時にアクセスする場合はどうなりますか?
+0

これを参照してくださいhttp://stackoverflow.com/q/17343157/2809326 – arjun

+1

@ElliottFrischスレッドローカルではなく、スタック変数です。 (それはリエントラントです。) – chrylis

答えて

6

変数がメソッド内で宣言されている場合、メソッドの1回の呼び出しで提供されるスタックフレーム内に存在します。スタックフレームは、メソッドを呼び出すスレッドによってのみアクセスされます。ポストされた例には競合条件はなく、メソッドを呼び出すたびに変数のコピーが得られます。競合状態になるためには、共有状態が必要です。

これらのスタックフレームは、再帰的メソッドを実行するときに積み重なるものであり、再帰により多くのスタックフレームが割り当てられるため、スタックオーバーフローエラーが発生するまでスタック領域を占有します。完了するチャンスを得る(スタックスペースを解放する)。