Wzorzec Singleton zapewnia, że klasa ma tylko jedną instancję i udostępnia do niej globalny dostęp. W VB.NET zwykle używa się prywatnego konstruktora i statycznej właściwości do przechowywania jedynej instancji:
Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' Prywatny konstruktor 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
Bezpieczeństwo wątków:
W środowisku wielowątkowym istnieje możliwość stworzenia dwóch instancji przy jednoczesnym dostępie. Rozwiązanie: użycie blokady lub konstrukcji Lazy(Of T):
' Leniwa, bezpieczna dla wątków implementacja 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
Różnica:
Jakie są zagrożenia związane z takim kodem dla implementacji Singleton?
Public Shared ReadOnly Property Instance() As Singleton Get If _instance Is Nothing Then _instance = New Singleton() End If Return _instance End Get End Property
Odpowiedź: W wielowątkowym środowisku może wystąpić sytuacja, w której dwa wątki jednocześnie zobaczą, że _instance jest Nothing, i obydwa utworzą obiekt. Dlatego takie podejście nie jest całkowicie bezpieczne dla wątków. Zaleca się użycie Lazy(Of T) lub SyncLock do blokady.
Historia
System ERP: Logger Singleton, uruchamiany z usług, czasami był tworzony podwójnie, logi ginęły. Powód — brak synchronizacji w właściwości, mimo że aplikacja była wielowątkowa.
Historia
Aplikacja Windows Forms: W projekcie wyciągnięto pracę z bazą danych do Singletona, ale nie zaimplementowano leniwej inicjalizacji. Przy starcie aplikacji miał miejsce ciężki connecting, co spowolniło ładowanie UI dla wszystkich.
Historia
Wtyczka platformy dziennikarskiej: Próbowano użyć statycznej zmiennej w module dla Singleton, niechronionej przed dostępem wielowątkowym, w rezultacie w fazie obciążenia pojawiło się kilka instancji obsługi poczty email, co spowodowało duplikację wiadomości.