Jos välität arvotyypin, se on laatikossa, ja seuraavalla kerralla kun koodi ajetaan tänne, se ruutuu uudelleen, eikä se ole sama objekti kahdesti, joten sitä ei voi lukita
lukko(x)
{ ...
}
Lukitus tehdään itse asiassa Monitor-objektin kautta:
Yllä oleva vastaa seuraavaa:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); yritä
{ ...
} vihdoin
{ System.Threading.Monitor.Exit(obj);
}
Sitten, lainatakseni MSDN:n alkuperäisiä sanoja: Käytä Monitoria lukitsemaan objektit (eli viitetyypit), älä arvotyyppejä. Kun siirrät arvotyyppimuuttujan Enterille, se on laatikossa objektina. Jos syötät saman muuttujan Enterille uudelleen, se on erillisenä objektina, eikä thethread estä sitä. Tässä tapauksessa koodi, jota Monitorin oletetaan suojaavan, ei ole suojattu. Lisäksi, kun siirrät muuttujan Exitille, syntyy vielä toinen erillinen objekti. Koska Exitille kulkeva objekti poikkeaa Enteriin siirtyneestä objektista, Monitor heittää SynchronizationLockExceptionin. Lisätietoja löytyy käsitteellisestä aiheesta Monitorit. |