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

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

[Kaynak] C# lock anahtar kelimesi, belirli bir nesne için mutex elde ederek bir ifade bloğunu kritik bir alan olarak işaretler ve ifadeyi çalıştırır, ama...

[Bağlantıyı kopyala]
Yayınlandı 31.12.2015 17:51:01 | | |
Kilit anahtar kelimesi, belirli bir nesne için mutex alıp ifadeyi çalıştırarak ve ardından kilidi serbest bırakarak bir ifade bloğunu kritik bölge olarak işaretler.

Lock ifadesi temelde Monitor.Enter ve Monitor.Exit kullanır; yani, lock(this) çalıştırıldığında Monitor.Enter(this) çalıştırılır ve Monitor.Exit(this) kıvrım braketin sonunda çalıştırılır. Anlamı nedir, herhangi bir nesne için, belleğin ilk kısmı tüm metodların adresi, ikinci kısmı ise bir indekstir. CLR'nin SyncBlock Önbellek alanında bir SyncBlock'a işaret ediyor. Bu ne anlama geliyor? Yani, Monitor.Enter(Object)'i çalıştırdığınızda, nesnenin indeks değeri negatif ise, SyncBlock Önbelleğinden bir SyncBlock seçin ve adresini nesnenin indeksine yerleştirin. Bu, nesne tarafından işaretlenen kilidi tamamlar ve diğer iş parçacıkları Monitor.Enter(object) işlemini tekrar yapmak ister; bu işlem pozitif bir nesneyle bir indeks alır ve sonra bekler. Indeks negatif olana kadar, yani iş parçacığı Monitor.Exit(object) kullanarak indeksi negatif hale getirir.

Kilit kullanırken dikkat etmeniz gerekenler:
1.lock null değeri kilitleyemez Bir nesne null'a işaret edebilir, ancak null serbest bırakılmasına gerek yoktur. (Ayrıca bakınız: Tam Null'u Anlamak)
2.lock dizi türünü kilitleyemez, ancak aynı zamanda referans tipidir. Çünkü dize tipi CLR tarafından "havada tutulur"
Bu, tüm programda herhangi bir dizinin yalnızca bir örneğinin olduğu ve aynı nesnenin tüm çalışan uygulama alanlarının tüm iş parçacıklarında o metni temsil ettiği anlamına gelir. Bu nedenle, uygulama sürecinin herhangi bir yerinde aynı içeriğe sahip bir diziye bir kilit yerleştirildiği sürece, uygulamadaki tüm bu dizinin örnekleri kilitlenir. Bu nedenle, ısrarcı olmayacak özel veya korunan üyeleri kilitlemek en iyisidir.
3.locklock nesne, bir program bloğunun bellek sınırıdır
4. Değer tipi kilitlenemez, çünkü önceki metinde "nesne serbest bırakılır" kırmızı renkte ve değer tipi referans tipi değildir
5.lock, program tarafından kontrol edilmeyen kamusal türleri veya nesneleri kilitlemekten kaçınır.
Örneğin, örnek kamuya açık ise, lock(this) sorun yaratabilir çünkü kontrolsüz kod da nesneyi kilitleyebilir. Bu durum, iki veya daha fazla iş parçacığının aynı nesneyi serbest bırakmak için beklediği deadlocklara yol açabilir. Kamuya açık veri türlerini (nesnelere değil) kilitlemek de aynı nedenle sorunlara yol açabilir.
lock(this) kullanılırken, sınıf üyesi değişkeninin değeri, kritik bölgede olmayan bir yöntemle değiştirilebilir

Uygulama senaryosu: Operasyonların güvenliğini sağlamak için çok iş parçacıklı işlemler nedeniyle oluşan genel değişkenlerin değerindeki belirsiz istisnaları önlemek için sıklıkla kullanılır









Önceki:Win8, SQL Server 2012 hizmetini başlatıyor
Önümüzdeki:[Hız] IP segmenti açık port tarayıcısı hızlı tarama hızı için!!
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