2012-07-18 18 views
18

Ho una domanda sull'ambito della variabile.Variabili locali nel metodo statico e sicurezza del thread

Ad esempio:

class A { 
    private static void test() { 
     // do something with local variables 
    } 
} 

ora faccio due fili, e creare un'istanza di A per ciascun thread.

  1. Quando chiamo test() in ogni thread, posso garantire che test() è thread-safe?

  2. Dove sono memorizzati i varibles locali in test()? Stack di ogni thread? Spazio di heap?

P.S. So che la staticità è totalmente inutile in questo caso. L'ho trovato nel nostro codice legacy; Voglio solo assicurarmi quello che so!

risposta

28

Le variabili locali sono memorizzate nello stack di ciascun thread. Ciò significa che le variabili locali non vengono mai condivise tra thread. Ciò significa anche che tutte le variabili primitive locali sono thread-safe.

I riferimenti locali agli oggetti sono leggermente diversi. Il riferimento stesso non è condiviso. L'oggetto a cui si fa riferimento, tuttavia, non è memorizzato nello stack locale di ciascun thread. Tutti gli oggetti sono memorizzati nell'heap condiviso. Se un oggetto creato localmente non fugge mai il metodo in cui è stato creato, è thread-safe. In effetti è possibile anche passarlo ad altri metodi e oggetti purché nessuno di questi metodi o oggetti renda l'oggetto passato disponibile ad altri thread.

I membri dell'oggetto vengono archiviati nell'heap insieme all'oggetto. Pertanto, se due thread chiamano un metodo sulla stessa istanza dell'oggetto e questo metodo aggiorna i membri dell'oggetto, il metodo non è thread-safe.

Controllo sicurezza filettatura: se una risorsa viene creata, utilizzata e disposta nel controllo dello stesso thread e non sfugge mai al controllo di questo thread, l'utilizzo di tale risorsa è thread-safe.

Da: http://tutorials.jenkov.com/java-concurrency/thread-safety.html

+2

+1, anche se si può certamente 'passaggio', (segnale), gli oggetti ad altri thread, ma il thread che ha creato solito deve 'cedere la proprietà' di essa, ad esempio. annullando il proprio riferimento o sovrascrivendolo creando un altro oggetto, in modo che due thread non possano mai operare sullo stesso oggetto. Se ciò non viene fatto, l'oggetto viene condiviso, come descritto, e necessita di blocchi per l'accesso. –

+0

Sì, per questo motivo, smaltire l'oggetto annullando il riferimento è una buona idea. – Erol

+0

Grande stavo per fare questa domanda !!!! – JohnMerlino

0

Per il numero 1, non so cosa fa test(), quindi non posso rispondere. Se modificano alcune variabili static della classe A, potrebbe non essere thread-safe. Se entrambi i thread lungo la strada hanno un riferimento allo stesso oggetto, a seconda di come è definito l'oggetto, potrebbe non essere thread-safe.

Per il numero 2, le variabili locali sono nello stack di ogni thread (o almeno concettualmente come quello), quindi non c'è da preoccuparsi che le variabili locali vengano modificate dagli altri thread.

2

Quando chiamo test() in ogni thread, posso garantire che test() è thread-safe?

Si sarebbe thread-safe se nel metodo di prova() si sta lavorando su variabili locali metodo.

Dove sono i varibles locali in prova() memorizzati? lo stack di ogni thread? spazio heap?

Metodo Le variabili locali sono memorizzate nello stack di ciascun thread.

Problemi correlati