Dacă treci un tip de valoare, acesta va fi blocat, iar data viitoare când codul rulează aici, va fi din nou blocat și nu va fi același obiect de două ori, deci nu poate fi blocat
Lacăt(x)
{ ...
}
Blocarea se face de fapt prin obiectul Monitor:
Cele de mai sus sunt echivalente cu:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); încearcă
{ ...
} în sfârșit
{ System.Threading.Monitor.Exit(obj);
}
Apoi, pentru a cita cuvintele originale ale MSDN: Folosește Monitor pentru a bloca obiecte (adică tipuri de referință), nu pentru tipurile de valori. Când pasezi o variabilă de tip valoare către Enter, aceasta este blocată ca un obiect. Dacă treci aceeași variabilă pe Enter din nou, aceasta este blocată ca un obiect separat, iar thread-ul nu blochează. În acest caz, codul pe care Monitorul ar trebui să-l protejeze nu este protejat. Mai mult, când treci variabila la Exit, se creează un alt obiect separat. Deoarece obiectul transmis către Exit este diferit de obiectul transmis către Enter, Monitor aruncă SynchronizationLockException. Pentru mai multe informații, vezi subiectul conceptual Monitors. |