SORU
24 Aralık 2008, ÇARŞAMBA


İçe dönük kilitleri C#

Aşağıdaki kodu bir kilitlenme C kullanarak neden olur#.NET?

 class MyClass
 {
    private object lockObj = new object();

    public void Foo()
    {
        lock(lockObj){ 
             Bar();
        }
    }

    public void Bar()
    {
        lock(lockObj){ 
          // Do something 
        }
    }       
 }

CEVAP
24 Aralık 2008, ÇARŞAMBA


Hayır, aynı nesne üzerinde kilit senin kadar uzun değil. Etkili bir özyinelemeli kodzaten kilidi vardırve böylece engellenmeden devam edebilir.

lock(object) {...} Monitor sınıfı kullanarak kısaltılmış halidir. Marc points out, Monitor sağlarre-entrancyyani bir nesne üzerine kilitlemek için girişimleri tekrarladıgeçerli iş parçacığı zaten bir kilit vardırsadece iyi çalışır.

Kilitleme başlatınfarklıdikkatli olmak zorunda, bu nesneler. Özellikle dikkat edin:

  • Elde kilitleri hep aynı sırayla verilen sayıda nesne üzerinde.
  • Her zaman yayın kilitlertersbunları almak ne kadar sıra.

Eğer bu kurallardan birini çiğnerseniz, çok fazla kilitlenme sorunları almak için garanti konumbir noktada.

İşte iyi bir web sayfası thread senkronizasyon tanımlıyor .NET: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/

Ayrıca, mümkün olduğunca bir seferde az nesne üzerinde kilitleyin. Mümkünse de aggregate roots Domain Driven Design ele alalım ve coarse-grained locks uygulayın. Fikir eğer kodunuzun nesne grafiği olarak yazabilirsiniz eğer bu varlık ve nesne grafiği kök kilitleri alın ve bunu yapın. Bu kök nesne üzerinde bir kilit var demektir ve bu nedenle çok hangi/release kilitleri dizisi hakkında endişelenmenize gerek yok.

(Bir tane daha örnek teknik olarak özyinelemeli değildir. Bu özyinelemeli olmak için, Bar() kendisini aramak için, genellikle bir döngü bir parçası olarak var olur.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • sonia989

    sonia989

    26 EKİM 2006
  • wolfys you tube

    wolfys you t

    22 Kasım 2006