2010-08-03 10 views
10

Ho una domanda sulle variabili all'interno del metodo statico. Le variabili all'interno del metodo statico condividono la stessa posizione di memoria o avrebbero una memoria separata?Condivisione di variabili all'interno del metodo statico

Ecco un esempio.

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

If 3 diverse chiamate utente esegue il metodo A

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

allo stesso tempo. Quali sarebbero i valori di ritorno di ciascuna chiamata?

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

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

+0

Si sta utilizzando una discussione? –

risposta

15

Sono ancora variabili locali, non sono condivise tra i thread. Il fatto che siano all'interno di un metodo statico non fa differenza.

Se è stato utilizzato un statica variabile come variabile intermedia, che sarebbe essere pericoloso:

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

Qui, tutti i fili sarebbero veramente utilizzeranno la stessa variabile b, quindi se si chiama il metodo da più thread contemporaneamente, il thread X potrebbe scrivere su b, seguito dal thread Y, in modo che il thread X abbia finito per restituire il valore impostato dal thread Y.

4

I thread non sovrascrivono i valori l'uno dell'altro, poiché le variabili sono interamente nello stack. Ogni thread ha una pila separata.

1

Questo non è un metodo thread-safe ma tutto le varibles automatiche sono thread safe automaticamente dal momento in cui la funzione viene chiamata si ottiene un nuovo stack frame. Tutti i locali vengono creati al momento dell'ingresso alla funzione e distrutti all'uscita. Come detto sopra se avessi usato la memoria statica, otterrai risultati inaspettati.

1

No, non condividono lo stesso spazio in memoria. Per la tua chiamata, sarebbero tornati, (nell'ordine che hai elencato): 10, 20 e 30.

Onestamente, con il codice di questo sarebbe vero in ogni caso (visto che tu sei solo assegnazione di un valore, non facendo nulla con esso), ma prendere in considerazione:

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

Poiché un metodo statico non può accedere a una variabile di istanza (almeno, senza avere un riferimento a un'istanza), non è possibile inizializzare una variabile una volta in un metodo statico senza che venga reinizializzata ogni volta che viene chiamato il codice. Per consentire a un metodo statico di modificare una variabile, è necessario passare due valori per operare su ciascuno di essi.

+0

A meno che tu non abbia una variabile statica, ovviamente. –

+0

Vero. Usarli così raramente li ho dimenticati ... per questa specifica domanda, comunque, non sembra un problema. – AllenG

Problemi correlati