Se passi un tipo di valore, verrà bloccato in una scatola, e la prossima volta che il codice verrà eseguito qui, verrà di nuovo bloccato e non sarà lo stesso oggetto due volte, quindi non potrà essere bloccato
Lock(x)
{ ...
}
Il blocco viene effettivamente eseguito tramite l'oggetto Monitor:
Quanto sopra è equivalente a:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); prova
{ ...
} finalmente
{ System.Threading.Monitor.Exit(obj);
}
Poi, per citare le parole originali della MSDN: Usa Monitor per bloccare oggetti (cioè tipi di riferimento), non tipi di valore. Quando passi una variabile di tipo avalue a Enter, viene riempita come oggetto. Se passi di nuovo la stessa variabile su Invio, viene riempita come oggetto separato e il thread non blocca. In questo caso, il codice che Monitor dovrebbe proteggere non è protetto. Inoltre, quando passi la variabile a Exit, viene creato un altro oggetto separato. Poiché l'oggetto passato a Exit è diverso dall'oggetto passato a Enter, Monitor lancia SynchronizationLockException. Per maggiori informazioni, vedi l'argomento concettuale Monitor. |