Bir değer tipi geçirirseniz, kutuya alınır ve kod bir dahaki çalışmada tekrar kutulanır ve aynı nesne iki kez olmaz, böylece kilitlenemez
kilit(x)
{ ...
}
Kilit aslında Monitor nesnesi üzerinden yapılır:
Yukarıdaki durum şuna eşdeğerdir:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Denemek
{ ...
} nihayet
{ System.Threading.Monitor.Exit(obj);
}
Sonra MSDN'nin orijinal sözlerini alıntılamak gerekirse: Monitor kullanılarak nesneleri (yani referans türlerini) kilitleyin, değer tipleri değil. Avalue type değişkenini Enter'e ilettiğinizde, o nesne olarak kutulanır. Aynı değişkeni tekrar Enter ile aktarırsanız, ayrı bir nesne olarak kutulanır ve thethread blok etmez. Bu durumda, Monitor'un koruması gereken kod korunmuyor. Ayrıca, değişkeni Exit'e geçirdiğinizde, başka ayrı bir nesne daha oluşturulur. Çıkışa gönderilen nesne, Enter'e gönderilen nesneden farklı olduğu için, Monitor SynchronizationLockException atar. Daha fazla bilgi için, kavramsal konu Monitörlere bakınız. |