Переменная, совместно использующая в статическом методе

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

Вот пример.

public class XYZ
{
    Public Static int A(int value)
    {
      int b = value;
      return b;
    }
}

Если 3 различных вызова пользователя выполняют метод A

XYZ.A(10);
XYZ.A(20);
XYZ.A(30);

одновременно. Каковы были бы возвращаемые значения каждого вызова?

XYZ.A(10)=?
XYZ.A(20)=?
XYZ.A(30)=?
10
задан CramerTV 8 November 2012 в 18:50
поделиться

4 ответа

Они по-прежнему являются локальными переменными - они не используются потоками. Тот факт, что они находятся в статическом методе, не имеет значения.

Если вы использовали статическую переменную в качестве промежуточной переменной, то было бы небезопасным:

public class XYZ
{
    // Don't do this! Horribly unsafe!
    private static int b;
    public static int A(int value)
    {
        b = value;
        return b;
    }
}

Здесь,все потоки действительно будут использовать одну и ту же переменную b , поэтому, если вы вызываете метод из нескольких потоков одновременно, поток X может писать в b , а затем поток Y, так что поток X вернул значение, установленное потоком Y.

15
ответ дан 3 December 2019 в 18:30
поделиться

Нет, они не используют одно и то же пространство в памяти. Для вашего звонка они вернутся (в указанном вами порядке): 10 , 20 и 30 .

Честно говоря, с вашим кодом это было бы верно в любом случае (поскольку вы просто присваиваете значение, а не делаете с ним ничего), но учтите:

Class XYZ
{
   public static int A (int value)
   {
      b += value;  \\Won't compile: b not initialized
      return b;
   }
}

Или

Class XYZ
{
   public static int A (int value)
   {
      int b = 0;  \\Initialized 'b' for each call
      b += value;  
      return b;
   }
}

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

1
ответ дан 3 December 2019 в 18:30
поделиться

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

4
ответ дан 3 December 2019 в 18:30
поделиться

Это не потокобезопасный метод, но все автоматические переменные автоматически становятся потокобезопасными, так как при каждом вызове функции вы получаете новый кадр стека. Все локали создаются при входе в функцию и уничтожаются при выходе. Как было сказано выше, если бы вы использовали статическое хранение, то получили бы неожиданные результаты.

1
ответ дан 3 December 2019 в 18:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: