Bu eski soruya verdikleri yanıtlarda hiç kimsenin bir istisnaya kilitlenmenin inanılmaz derecede tehlikeli bir şey olduğundan bahsetmediğini not ediyorum . Evet, C # içindeki kilit deyimleri "nihayet" anlamsallığına sahiptir; kontrol normal veya anormal şekilde kilitten çıktığında, kilit serbest bırakılır. Hepiniz bundan iyi bir şeymiş gibi bahsediyorsunuz, ama bu kötü bir şey! Eğer işlenmeyen bir özel durum için atar kilitli bölgeyi varsa doğru şeyin daha kullanıcı verilerini tahrip hemen önce hastalıklı süreci sonlandırmak değil, kilit boşaltın ve gitmeye devam .
Şuna bakın: Diyelim ki kapısında kilit olan bir banyonuz ve dışarıda bekleyen bir sıra insan var. Banyodaki bir bomba patlayarak içerideki kişiyi öldürür. Sorunuz "bu durumda kilit otomatik olarak açılacak ve böylece sonraki kişi banyoya girebilecek mi?" Evet olacak. Bu iyi birşey değil. Orada bir bomba patladı ve birini öldürdü! Tesisat muhtemelen yıkılmıştır, ev artık yapısal olarak sağlam değildir ve orada başka bir bomba olabilir . Yapılacak doğru şey, herkesi olabildiğince çabuk dışarı çıkarmak ve tüm evi yıkmaktır.
Demek istediğim, bir düşünün: bir veri yapısından başka bir iş parçacığında mutasyona uğratılmadan okumak için bir kod bölgesini kilitlediyseniz ve bu veri yapısındaki bir şey bir istisna attıysa, büyük olasılıkla veri yapısı bozuk . Kullanıcı verileri artık karıştı; Bu noktada kullanıcı verilerini kaydetmeyi denemek istemezsiniz çünkü daha sonra bozuk verileri kaydediyorsunuz . Sadece süreci sonlandırın.
Aynı anda durumu okuyan başka bir iş parçacığı olmadan bir mutasyon gerçekleştirmek için bir kod bölgesini kilitlediyseniz ve mutasyon atarsa, o zaman veriler daha önce bozuk değilse, kesinlikle şimdi . İşte kilidin koruması gereken senaryo da tam olarak budur . Şimdi bu durumu okumayı bekleyen koda derhal bozuk duruma erişim verilecek ve muhtemelen kendisi çökecektir. Yine, yapılacak doğru şey süreci sonlandırmaktır.
Nasıl dilimlediğin önemli değil, bir kilidin içindeki istisna kötü haberdir . Sorulması gereken doğru soru "bir istisna durumunda kilidim temizlenecek mi?" Sorulması gereken doğru soru, "bir kilidin içinde hiçbir zaman bir istisna olmamasını nasıl sağlayabilirim? Ve eğer varsa, o zaman programımı, mutasyonların önceki iyi durumlara geri döndürülmesi için nasıl yapılandırırım?"