Ако предадеш тип стойност, той ще бъде в кутия, а следващия път, когато кодът се изпълни тук, ще бъде отново в кутия и няма да е един и същ обект два пъти, така че не може да бъде заключен
Заключване(x)
{ ...
}
Заключването всъщност се извършва чрез обекта Monitor:
Горното е еквивалентно на:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Опитай
{ ...
} накрая
{ System.Threading.Monitor.Exit(obj);
}
След това цитирам оригиналните думи на MSDN: Използвайте Monitor за заключване на обекти (т.е. референтни типове), а не за типове стойности. Когато подадете променлива тип avalue на Enter, тя се поставя в кутия като обект. Ако подадеш същата променлива към Enter отново, тя се поставя в кутия като отделен обект и нишката не блокира. В този случай кодът, който Monitor уж защитава, не е защитен. Освен това, когато предадеш променливата към Exit, се създава още един отделен обект. Тъй като обектът, прехвърлен към Exit, е различен от обекта, прехвърлен към Enter, Monitor хвърля SynchronizationLockException. За повече информация вижте концептуалната тема Монитори. |