2011-02-24 11 views
6

Un paio di volte ho trovato questo codice in cui una variabile locale in una classe (la sua NON una variabile statica) è stata utilizzata in una serratura.Qual è il punto di utilizzo di una variabile locale non statica in un blocco?

public class SomeClass 
{ 
    private object obj = new object(); 
    .... 
    .... 
    lock(obj) 
    { 

    } 
} 

C'è qualche punto di blocco dato che è una variabile di istanza?

+2

Sì, se è necessario sincronizzare gli oggetti in particolare istanza – Stecya

+2

Questa non è una * variabile locale * (locale in un singolo metodo), ma un * campo * o * variabile d'istanza *. – Justin

+1

Puoi spiegare perché pensi che questo potrebbe essere un problema? –

risposta

14

C'è qualche punto di blocco dato che è una variabile di istanza?

Più thread potrebbero agire sulla stessa istanza e un blocco è necessario per la sicurezza del thread. Pensa, ad esempio, a una coda condivisa.

+0

Quindi, se una coda è condivisa, non sarebbe meglio renderla statica? Sto solo facendo fatica a immaginare questo caso d'uso nella mia mente. Per me, dal momento che tutte le variabili di istanza sono locali a quell'istanza di classe, più thread che creano un'istanza di questa classe ne avranno una copia diversa. Cosa mi manca? – imak

+0

@imak: pensa a una coda di attività ('classe TaskQueue'). Ora pensa a una singola istanza di questo 'TaskQueue'. Ora pensate che sia condiviso tra più thread (forse più produttori e più utenti). C'è solo un'istanza della coda e tutte le variabili di istanza sono condivise tra i vari thread. È necessaria una variabile di istanza per il blocco per rendere questa istanza "thread-safe". – jason

+2

@imak: per estendere l'esempio di Jason: supponi di avere due code. Q1 è utilizzato sui thread Alpha e Bravo. Q2 è utilizzato sui thread Charlie e Delta. Perché il thread Alpha che accede a Q1 dovrebbe impedire a Charlie e Delta di accedere contemporaneamente a Q2? Ciò dovrebbe impedire a Bravo (e Charlie e Delta) di accedere a Q1, ma non c'è motivo per cui a Charlie e Delta debba essere proibito accedere a Q2 durante quel periodo. –

5

Un blocco statico sarebbe utile per controllare l'accesso a una variabile statica. Un blocco di istanze sarebbe utile per controllare l'accesso a una variabile di istanza.

Non è necessario utilizzare un oggetto di blocco locale per proteggere una variabile locale (a meno che non si tratti di una variabile esterna catturata di una funzione anonima o di un iteratore), poiché altri thread non avranno accesso al blocco. o la variabile.

+1

A meno che non si disponga di una variabile locale a cui si accede tramite 'Azione' o' Func' o metodi anonimi definiti nello stesso metodo. –

+0

@Jim Mischel - Risolto, grazie! –

Problemi correlati