Состояние гонки в переменной в статическом методе

У меня есть следующий метод:

public static void method() {

int i = 0;
i = i + 1;

}

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

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

person Lakmal Vithanage    schedule 23.02.2017    source источник
comment
обратитесь к этому stackoverflow.com/q/17343157/2809326   -  person arjun    schedule 23.02.2017
comment
@ElliottFrisch Это не локальная переменная потока, это переменная стека. (Разница в том, что он реентерабельный.)   -  person chrylis -cautiouslyoptimistic-    schedule 23.02.2017


Ответы (2)


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

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

person Nathan Hughes    schedule 23.02.2017

Нет, нет состояния гонки с локальной переменной статического метода. Потому что для каждого вызова метода, статического или нестатического, в стеке будет отдельная память, поэтому локальная переменная этого статического метода будет отдельной для каждого потока, и не будет никаких условий гонки.

person Arvind Kumar Maurya    schedule 09.10.2019