静态方法内部变量共享
我对静态方法内部的变量有疑问。 静态方法中的变量是否共享相同的内存位置,或者它们是否具有单独的内存?静态方法内部变量共享
这里是一个例子。
public class XYZ
{
Public Static int A(int value)
{
int b = value;
return b;
}
}
如果3个不同的用户的呼叫的同时执行该方法的
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;
}
}
由于静态方法不能访问实例变量(至少不是没有对实例的引用),所以没有办法在静态方法中初始化一个变量,而不必在每次调用代码时重新初始化变量。为了允许静态方法更改变量,您需要传入两个值以相互操作。
除非你有一个静态变量,当然。 – 2010-08-03 19:30:16
是的。但是,很少使用它们,我忘了它们......对于这个特定的问题,这看起来并不是一个问题。 – AllenG 2010-08-03 19:43:14
请参阅:http://*.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe – 2010-08-03 19:12:19
你使用任何线程? – 2010-08-03 20:18:53