Hvis du sender en værditype, vil den blive bokset, og næste gang koden kører her, vil den blive bokset igen, og det vil ikke være det samme objekt to gange, så det kan ikke låses
lock(x)
{ ...
}
Låsen udføres faktisk via Monitor-objektet:
Ovenstående svarer til:
System.Objekt obj = (System.Objekt)x; System.Threading.Monitor.Enter(obj); Prøv
{ ...
} endelig
{ System.Threading.Monitor.Exit(obj);
}
Så for at citere de oprindelige ord fra MSDN: Brug Monitor til at låse objekter (dvs. referencetyper), ikke værdityper. Når du sender en værditypevariabel til Enter, bliver den bokset som et objekt. Hvis du sender den samme variabel til Enter igen, bliver den bokset som et separat objekt, og thethread blokerer ikke. I dette tilfælde er den kode, som Monitor angiveligt skal beskytte, ikke beskyttet. Desuden, når du sender variablen til Exit, oprettes endnu et separat objekt. Fordi objektet, der sendes til Exit, er forskelligt fra objektet, der sendes til Enter, kaster Monitor SynchronizationLockException. For mere information, se det konceptuelle emne Monitors. |