2010-08-03 25 views
10

Tengo una pregunta sobre las variables dentro del método estático. ¿Las variables dentro del método estático comparten la misma ubicación de memoria o tendrían memoria separada?Intercambio de variables dentro del método estático

Aquí hay un ejemplo.

public class XYZ 
{ 
    Public Static int A(int value) 
    { 
     int b = value; 
     return b; 
    } 
} 

Si hay 3 diferentes llamadas de los usuarios ejecutan el método A

XYZ.A(10); 
XYZ.A(20); 
XYZ.A(30); 

al mismo tiempo. ¿Cuáles serían los valores de retorno de cada llamada?

XYZ.A(10)=? 
XYZ.A(20)=? 
XYZ.A(30)=? 
+0

Ver: http://stackoverflow.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe –

+0

¿Está utilizando algún hilo? –

Respuesta

15

Siguen siendo variables locales, no se comparten entre subprocesos. El hecho de que estén dentro de un método estático no hace diferencia.

Si ha utilizado una variable estática como variable intermedia, que habría ser inseguro:

public class XYZ 
{ 
    // Don't do this! Horribly unsafe! 
    private static int b; 
    public static int A(int value) 
    { 
     b = value; 
     return b; 
    } 
} 

Aquí, todos los hilos realmente estarían utilizando el mismo b variables, por lo que si usted llama la método de varios subprocesos simultáneamente, el subproceso X podría escribir en b, seguido del subproceso Y, de modo que el subproceso X terminó devolviendo el valor establecido por el subproceso Y.

4

Los hilos no se sobrescribirán los valores de los demás, ya que las variables están completamente en la pila. Cada hilo tiene una pila separada.

1

Este no es un método seguro para subprocesos, pero todos Las varibles automáticas son seguras para hilos de forma automática ya que cada vez que se llama a la función obtienes un nuevo marco de pila. Todos los locales se crean al ingresar a la función y se destruyen al salir. Como se dijo anteriormente, si hubiera utilizado almacenamiento estático, obtendría resultados inesperados.

1

No, no comparten el mismo espacio en la memoria. Para su llamada, regresarían, (en el orden que indicó): 10, 20 y 30.

Honestamente, con su código de esto sería cierto en cualquier caso (ya que sólo está asignando un valor, no hacer nada con ella) pero tenga en cuenta:

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

O

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

Como un método estático no puede acceder a una variable de instancia (al menos, no sin tener una referencia a una instancia), no hay forma de inicializar una variable una vez en un método estático sin que se reinicie cada vez que se invoca el código. Para permitir que un método estático cambie una variable, necesitaría pasar dos valores para operar uno sobre el otro.

+0

A menos que tengas una variable estática, por supuesto. –

+0

Es cierto. Úselos con tanta poca frecuencia que me olvidé de ellos ... para esta pregunta específica, eso no parece ser un problema, sin embargo. – AllenG

Cuestiones relacionadas