Совместное использование переменных внутри статического метода

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

Вот пример.

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)=?

person Krishna    schedule 03.08.2010    source источник
comment
См .: stackoverflow.com/questions/420895/   -  person Anthony Pegram    schedule 03.08.2010


Ответы (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 .

person Jon Skeet    schedule 03.08.2010

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

person Justin    schedule 03.08.2010

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

person rerun    schedule 03.08.2010

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

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

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

Or

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

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

person AllenG    schedule 03.08.2010
comment
Истинный. Используйте их так редко, что я забыл о них ... для этого конкретного вопроса, однако, это не похоже на проблему. - person AllenG; 03.08.2010