dichiarazione La serratura non "Blocca codice" o qualsiasi risorsa che va tra le parentesi graffe pre se.
Trovo che sia meglio comprendere il blocco da una prospettiva di thread (dopo tutto, gli scenari di threading sono quando è necessario considerare il blocco).
Dato il suo codice di esempio
10 locker = new object();
11 lock (locker)
12 {
...
15 }
Quando il filo X raggiunge la linea 10 viene creato un nuovo oggetto e alla linea 11, un blocco viene acquisito sull'oggetto. Thread X continua a eseguire qualsiasi codice all'interno del blocco.
Ora, mentre filettatura X è al centro del nostro blocco, filo Y raggiunge la linea 10. Lo ed ecco, viene creato un nuovo oggetto, e poiché è creato da filo Y serratura è attualmente acquisito su questo oggetto. Quindi, quando il thread Y raggiunge 11, acquisirà un blocco sull'oggetto e continuerà a eseguire il blocco contemporaneamente alla thread X.
Questa è la situazione che il blocco doveva impedire. Quindi che si fa? Make locker a oggetto condiviso.
01 static object locker = new object();
...
11 lock (locker)
12 {
...
15 }
Ora, quando il filo X raggiunge la linea 11 sarà acquisire il blocco e inizia l'esecuzione del blocco. Quando il thread Y raggiunge la riga 11, proverà ad acquisire un blocco sullo stesso oggetto del thread X. Poiché questo oggetto è già bloccato, il thread Y attenderà fino al rilascio del blocco. Impedendo così l'esecuzione concorrente del blocco di codice, proteggendo così tutte le risorse utilizzate da quel codice per l'accesso simultaneo.
Nota: se altre parti del sistema devono essere serializzate attorno alle stesse risorse, devono cercare di bloccare lo stesso oggetto di blocco condiviso.
fonte
2009-08-11 12:49:47
Una spiegazione ancora migliore per un principiante. Grazie mille oh –
Sei così totalmente benvenuto :) –