Kimsenin soruyu gerçekten yanıtladığını sanmıyorum , bu yüzden bir deneyeceğim.
Uçucu ve ilk if (instance == null)
"gerekli" değildir. Kilit, bu kodu iş parçacığı için güvenli hale getirecektir.
Öyleyse soru şu: neden ilkini eklersiniz if (instance == null)
?
Bunun nedeni muhtemelen kodun kilitli bölümünü gereksiz yere yürütmekten kaçınmaktır. Kilidin içindeki kodu çalıştırırken, bu kodu da yürütmeye çalışan diğer herhangi bir iş parçacığı engellenir, bu da birçok iş parçacığından sık sık singleton'a erişmeye çalışırsanız programınızı yavaşlatır. Dile / platforma bağlı olarak, kilidin kendisinden kaçınmak isteyebileceğiniz genel giderler de olabilir.
Bu nedenle, kilide ihtiyacınız olup olmadığını görmenin gerçekten hızlı bir yolu olarak ilk sıfır kontrolü eklenir. Tekli oluşturmanıza gerek yoksa, kilidi tamamen önleyebilirsiniz.
Ancak, referansın bir şekilde kilitlemeden boş olup olmadığını kontrol edemezsiniz, çünkü işlemci önbelleğe alma nedeniyle başka bir iş parçacığı onu değiştirebilir ve gereksiz yere kilide girmenize neden olacak "eski" bir değer okuyabilirsiniz. Ama kilitlenmekten kaçınmaya çalışıyorsun!
Böylece, kilit kullanmaya gerek kalmadan en son değeri okumanızı sağlamak için tekliyi uçucu hale getirirsiniz.
Yine de iç kilide ihtiyacınız var çünkü volatile yalnızca değişkene tek bir erişim sırasında sizi korur - bir kilit kullanmadan güvenli bir şekilde test edip ayarlayamazsınız.
Şimdi, bu gerçekten faydalı mı?
Pekala, "çoğu durumda hayır" derdim.
Singleton.Instance kilitler nedeniyle verimsizliğe neden olabiliyorsa, o zaman neden bu kadar sık çağırıyorsunuz ki bu önemli bir sorun olur ? Bir singletonun tüm amacı, yalnızca bir tane olmasıdır, böylece kodunuz singleton referansını bir kez okuyabilir ve önbelleğe alabilir.
Bu önbelleğe almanın nerede mümkün olmayacağını düşünebildiğim tek durum, çok sayıda iş parçacığına sahip olduğunuzda olabilir (örneğin, her isteği işlemek için yeni bir iş parçacığı kullanan bir sunucu, her biri çok kısa çalışan milyonlarca iş parçacığı oluşturuyor olabilir) Singleton.Instance'ı bir kez çağırmak zorunda kalacaktı).
Bu yüzden, çifte kontrollü kilitlemenin performans açısından kritik çok özel durumlarda gerçek bir yeri olan bir mekanizma olduğundan şüpheleniyorum ve sonra herkes gerçekten ne yaptığını ve yapıp yapmadığını düşünmeden "bunu yapmanın doğru yolu bu" ana vagonuna takıldı. aslında kullanmaları durumunda gerekli olacaktır.