Ak odovzdáte typ hodnoty, bude zablokovaný a pri ďalšom spustení kódu sa opäť zablokuje, a nebude to ten istý objekt dvakrát, takže ho nemožno zamknúť
lock(x)
{ ...
}
Zámok sa v skutočnosti vykonáva cez objekt Monitor:
Vyššie uvedené je ekvivalentné:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Skús
{ ...
} nakoniec
{ System.Threading.Monitor.Exit(obj);
}
Potom, aby som citoval pôvodné slová MSDN: Na uzamknutie objektov (teda referenčných typov) použite Monitor, nie na hodnotové typy. Keď odovzdáte premennú typu avalue do Enter, označí sa ako objekt. Ak pošlete tú istú premennú do Enter znova, je označená ako samostatný objekt a vlákno sa neblokuje. V tomto prípade kód, ktorý má Monitor údajne chrániť, nie je chránený. Navyše, keď odovzdáte premennú do Exit, vytvorí sa ďalší samostatný objekt. Pretože objekt odoslaný do Exit je odlišný od objektu odoslaného do Enter, Monitor hodí SynchronizationLockException. Pre viac informácií pozri konceptuálnu tému Monitori. |