Hvis du gir en verditype, vil den bli bokset, og neste gang koden kjører her, vil den bli bokset igjen, og det vil ikke være det samme objektet to ganger, så det kan ikke låses
lock(x)
{ ...
}
Låsen gjøres faktisk gjennom Monitor-objektet:
Ovenstående tilsvarer:
System.Objekt obj = (System.Objekt)x; System.Threading.Monitor.Enter(obj); Prøv
{ ...
} endelig
{ System.Threading.Monitor.Exit(obj);
}
Så for å sitere de opprinnelige ordene fra MSDN: Bruk Monitor for å låse objekter (altså referansetyper), ikke verdityper. Når du sender en verditypevariabel til Enter, blir den bokset inn som et objekt. Hvis du sender samme variabel til Enter igjen, blir den bokset som et eget objekt, og thethread blokkerer ikke. I dette tilfellet er koden som Monitor angivelig skal beskytte ikke beskyttet. Videre, når du sender variabelen til Exit, opprettes enda et separat objekt. Fordi objektet som sendes til Exit er forskjellig fra objektet som sendes til Enter, kaster Monitor SynchronizationLockException. For mer informasjon, se det konseptuelle temaet Monitorer. |