我对静态方法中的变量有疑问。 静态方法中的变量是共享相同的内存位置还是它们具有单独的内存?
这是一个例子。
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)=?
答案 0 :(得分:15)
它们仍然是局部变量 - 它们不在线程之间共享。他们在静态方法中的事实没有任何区别。
如果您使用 static 变量作为中间变量,将不安全:
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设置的值。
答案 1 :(得分:4)
线程不会覆盖彼此的值,因为变量完全在堆栈上。每个线程都有一个单独的堆栈。
答案 2 :(得分:1)
这不是一个线程安全的方法,但是所有自动变量都是自动线程安全的,因为无论何时调用该函数,您都会得到一个新的堆栈帧。所有本地人在进入该功能时创建,并在退出时销毁。如上所述,如果你使用过静态存储,那么你会得到意想不到的结果。
答案 3 :(得分:1)
不,他们在内存中没有共享相同的空间。对于您的通话,他们会返回(按您列出的顺序):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;
}
}
由于静态方法无法访问实例变量(至少,没有对实例的引用),因此无法在每次调用代码时重新初始化静态方法中的变量一次。要允许静态方法更改变量,您需要传入两个值以便相互操作。