Ja nododat vērtības tipu, tas tiks ievietots kastē, un nākamajā reizē, kad kods tiks palaists šeit, tas atkal tiks ievietots kastē, un tas nebūs tas pats objekts divas reizes, tāpēc to nevar bloķēt
slēdzene(x)
{ ...
}
Bloķēšana faktiski tiek veikta, izmantojot monitora objektu:
Iepriekš minētais ir līdzvērtīgs:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); izmēģināt
{ ...
} Beidzot
{ System.Threading.Monitor.Exit(obj);
}
Tad, citējot MSDN oriģinālos vārdus: Izmantojiet monitoru, lai bloķētu objektus (t.i., atsauču tipus), nevis vērtību tipus. Nododot vērtības tipa mainīgo taustiņam Enter, tas tiek ievietots lodziņā kā objekts. Ja jūs nododat to pašu mainīgo vēlreiz Enter, tas tiek ievietots kastē kā atsevišķs objekts, un pavediens netiek bloķēts. Šajā gadījumā kods, ko Monitorsit kā aizsargā, nav aizsargāts. Turklāt, nododot mainīgo iziet, tiek izveidots vēl viens atsevišķs objekts. Tā kā izejai nodotais objekts atšķiras no objekta, kas nodots taustiņam Enter, monitors izmet SynchronizationLockException. Plašāku informāciju skatiet konceptuālajā tēmā Monitori. |