Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 18907|Yanıt: 0

[Kaynak] lock Neden sadece referansı kilitleyebiliyor ama değer türünü kilitlemiyor?

[Bağlantıyı kopyala]
Yayınlandı 8.12.2016 10:43:37 | | |

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.




Önceki:Python 2.6.6'yı Centos 6.4 sisteminde 2.7.5'e yükseltmek
Önümüzdeki:Directory.GetCurrentDirectory ile Application.StartupPath arasındaki fark
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com