Singleton tasarımı, bir sınıfın yalnızca bir örneğinin olmasını garanti eder ve ona global bir erişim noktası sağlar. VB.NET'te genellikle özel bir yapıcı ve tek bir örneği saklamak için statik bir özellik kullanılır:
Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' Özel yapıcı End Sub Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property End Class
Çok iş parçacıklı güvenlik:
Çok iş parçacıklı bir ortamda, eşzamanlı erişim sırasında iki örneğin oluşturulması mümkündür. Çözüm: kilitleme veya Lazy(Of T) yapısını kullanmak:
' Tembel çok iş parçacıklı güvenli uygulama Public Class Singleton Private Shared ReadOnly _instance As New Lazy(Of Singleton)(Function() New Singleton()) Private Sub New() End Sub Public Shared ReadOnly Property Instance() As Singleton Get Return _instance.Value End Get End Property End Class
Fark:
Aşağıdaki kod Singleton uygulaması için neden tehlikeli?
Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property
Cevap: Çok iş parçacıklı bir ortamda, iki iş parçacığı aynı anda _instance'ın Nothing olduğunu görebilir ve her ikisi de nesneyi oluşturabilir. Bu nedenle, bu yaklaşım tamamen çok iş parçacıklı güvenli değildir. Lazy(Of T) veya SyncLock kullanarak kilitleme önerilir.
Hikaye
ERP sistemi: Singleton logger, servislerden çalıştırıldığında bazen iki kez oluşturulmuş, loglar kaybolmuştur. Sebep - özellikte senkronizasyon eksikliğiydi, uygulama çok iş parçacıklıydı.
Hikaye
Windows Forms uygulaması: Projede veritabanı işlemlerini Singleton'a taşıdılar, ama tembel başlangıcı uygulamadılar. Uygulama başlarken ağır bir bağlantı yapıldı, bu da tüm kullanıcılar için UI'nin yüklenmesini yavaşlattı.
Hikaye
Gazetecilik platformu eklentisi: Singleton için çok iş parçacıklı erişime karşı korunaksız bir modülde statik değişken kullanmaya çalıştılar, bu da yoğun yük altında email bülten yöneticisinin birden fazla örneğinin ortaya çıkmasına neden oldu ve bu da çoğaltılmış e-postalara yol açtı.