Hayır, aynı nesneye kilitlendiğin sürece. Özyinelemeli kod etkin bir şekilde zaten kilide sahiptir ve böylece engellenmeden devam edebilir.
lock(object) {...}
Monitor sınıfını kullanmanın kısaltmasıdır . As Marc işaret , Monitor
izin verir yeniden entrancy böylece bir nesne üzerinde kilit girişimleri tekrarlanan, geçerli iş parçacığı zaten kilit var hangi sadece ceza çalışacaktır.
Farklı nesnelere kilitlenmeye başlarsanız , o zaman dikkatli olmanız gerekir. Şunlara özellikle dikkat edin:
- Her zaman belirli sayıda nesnede aynı sırayla kilit alın.
- Kilitleri her zaman nasıl elde ettiğinize göre ters sırada serbest bırakın .
Bu kurallardan herhangi birini ihlal ederseniz , bir noktada kilitlenme sorunları yaşayacağınız hemen hemen garantidir .
NET'te iş parçacığı senkronizasyonunu açıklayan iyi bir web sayfası: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
Ayrıca, bir seferde mümkün olduğunca az nesneyi kilitleyin. Mümkünse iri taneli kilitler uygulamayı düşünün . Buradaki fikir, kodunuzu bir nesne grafiği olacak şekilde yazabiliyorsanız ve bu nesne grafiğinin kökünde kilitler elde edebiliyorsanız, o zaman bunu yapın. Bu, o kök nesnede bir kilidiniz olduğu ve bu nedenle kilitleri elde ettiğiniz / bıraktığınız sıra hakkında çok fazla endişelenmenize gerek olmadığı anlamına gelir.
(Bir not daha, örneğiniz teknik olarak özyinelemeli değildir. Özyinelemeli Bar()
olması için, tipik olarak bir yinelemenin parçası olarak kendisini çağırması gerekir.)