Ha egy értéktípust passzol, az dobozba kerül, és amikor a kód legközelebb itt fut, újra becsomagolják, és nem lesz ugyanaz az objektum kétszer, így nem lehet zárolni
lock(x)
{ ...
}
A zárolás valójában a Monitor objektumon keresztül történik:
A fentiek ekvivalena megfelel annak:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); próbáld ki
{ ...
} végül
{ System.Threading.Monitor.Exit(obj);
}
Akkor idézve az MSDN eredeti szavait: Használd a Monitort a tárgyak (azaz referenciatípusok) zárolására, értéktípusok nélkül. Amikor az érték típusú változót az Enter mappába adjuk, az objektumként kerül bezárva. Ha ugyanazt a változót újra átadod az Enter bekapcsolónak, az külön objektumként kerül bezárásra, és a thread nem blokkol. Ebben az esetben az a kód, amelyet a Monitor állítólag véd, nem védett. Továbbá, amikor átadod a változót Exit-re, még egy különálló objektum jön létre. Mivel az Exit-hez továbbított objektum eltér attól, amit az Enter felé továbbított, a monitor SynchronizationLockException-t dob. További információért lásd: Monitorok című koncepcionális téma. |