2017-02-23 39 views
1

У меня есть метод следующим образом:состояние гонки в переменной в статическом методе

public static void method() { 

int i = 0; 
i = i + 1; 

} 

У меня есть переменная Int внутри статического метода. К этому методу обращаются несколько потоков.
Мои вопросы:

  1. Имеет ли i переменной идти в состояние гонки?
  2. Что делать, если метод доступен в весеннем веб-приложении и одновременно доступен нескольким пользователям?
+0

ссылается на этот http://stackoverflow.com/q/17343157/2809326 – arjun

+1

@ElliottFrisch Это не локальный поток, это переменная стека. (Различие заключается в том, что он переадресован.) – chrylis

ответ

6

Если переменная объявлена ​​в методе, то она живет в стеке, предусмотренном для одного вызова метода. Доступ к стеку осуществляется только потоком, вызывающим метод. В приведенном примере нет условия гонки, каждый вызов метода получает свою собственную копию переменной. Для того, чтобы иметь состояние гонки, вам нужно общее состояние.

Эти стековые фреймы - это вещи, которые накапливаются при выполнении рекурсивного метода и занимают пространство стека, пока в какой-то момент не возникнет ошибка stackoverflow, поскольку рекурсия приводит к тому, что все больше стековых кадров получает выделение, а ни один из методов не вызывает получите шанс завершить (что освободит пространство стека).