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 , Monitorizin 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.)