静态方法内部变量共享

问题描述:

我对静态方法内部的变量有疑问。 静态方法中的变量是否共享相同的内存位置,或者它们是否具有单独的内存?静态方法内部变量共享

这里是一个例子。

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

请参阅:http://*.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe – 2010-08-03 19:12:19

+0

你使用任何线程? – 2010-08-03 20:18:53

它们仍然是局部变量 - 它们不在线程之间共享。它们处于静态方法的事实没有任何区别。

如果您使用的静态变量作为中间变量,是不安全的:

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,2030

说实话,你的代码,这将在任何情况下是正确的(因为你只是分配一个值,没有做任何事的),但考虑:

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; 
    } 
} 

由于静态方法不能访问实例变量(至少不是没有对实例的引用),所以没有办法在静态方法中初始化一个变量,而不必在每次调用代码时重新初始化变量。为了允许静态方法更改变量,您需要传入两个值以相互操作。

+0

除非你有一个静态变量,当然。 – 2010-08-03 19:30:16

+0

是的。但是,很少使用它们,我忘了它们......对于这个特定的问题,这看起来并不是一个问题。 – AllenG 2010-08-03 19:43:14