Pokud předáte typ hodnoty, bude zablokován a příště, když kód běží zde, bude znovu zablokovaný, a nebude to stejný objekt dvakrát, takže ho nelze uzamknout
lock(x)
{ ...
}
Zámek je ve skutečnosti proveden přes objekt Monitor:
Výše uvedené je ekvivalentní s:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); zkus
{ ...
} nakonec
{ System.Threading.Monitor.Exit(obj);
}
A pak cituji původní slova MSDN: Používejte Monitor k zamčení objektů (tedy typů referencí), ne k typům hodnot. Když předáte proměnnou typu avalue do Enter, je označena jako objekt. Pokud stejnou proměnnou znovu předáte do Enter, je to označeno jako samostatný objekt a vlákno se neblokuje. V tomto případě není kód, který má Monitor údajně chránit, chráněn. Navíc, když předáte proměnnou do Exit, vytvoří se další samostatný objekt. Protože objekt předávaný do Exit se liší od objektu předaného do Enter, Monitor hodí SynchronizationLockException. Pro více informací viz konceptuální téma Monitory. |