У меня есть вопрос о переменных в статическом методе. Переменные в статическом методе совместно используют ту же ячейку памяти, или у них была бы отдельная память?
Вот пример.
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)=?
Они по-прежнему являются локальными переменными - они не используются потоками. Тот факт, что они находятся в статическом методе, не имеет значения.
Если вы использовали статическую переменную в качестве промежуточной переменной, то было бы небезопасным:
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.
Нет, они не используют одно и то же пространство в памяти. Для вашего звонка они вернутся (в указанном вами порядке): 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;
}
}
Поскольку статический метод не может получить доступ к переменной экземпляра (по крайней мере, без ссылки на экземпляр), невозможно инициализировать переменную один раз в статическом методе без ее повторной инициализации каждый раз при вызове кода. Чтобы статический метод мог изменять переменную, вам нужно будет передать два значения для работы друг с другом.
Потоки не будут перезаписывать значения друг друга, поскольку переменные целиком находятся в стеке. У каждого потока есть отдельный стек.
Это не потокобезопасный метод, но все автоматические переменные автоматически становятся потокобезопасными, так как при каждом вызове функции вы получаете новый кадр стека. Все локали создаются при входе в функцию и уничтожаются при выходе. Как было сказано выше, если бы вы использовали статическое хранение, то получили бы неожиданные результаты.