Het Singleton-patroon garandeert dat een klasse slechts één instantie heeft en biedt een wereldwijde toegangspunt hiervoor. In VB.NET wordt vaker een privéconstructor en een statische eigenschap gebruikt om de enige instantie op te slaan:
Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' Privé constructor 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
Threadveiligheid:
In een multi-threaded omgeving kan het creëren van twee instanties voorkomen als er gelijktijdig wordt aangesproken. Oplossing: gebruik een lock of de Lazy(Of T)-constructie:
' Luie threadveilige implementatie 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
Verschil:
Wat is gevaarlijk aan deze code voor de implementatie van 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
Antwoord: In een multi-threaded omgeving kan het voorkomen dat twee threads gelijktijdig zien dat _instance Nothing is, en beide een object creëren. Daarom is deze benadering niet volledig threadveilig. Het wordt aanbevolen om Lazy(Of T) of SyncLock voor locking te gebruiken.
Verhaal
ERP-systeem: Singleton logger werd soms twee keer aangemaakt bij het opstarten vanuit services, waardoor logs verloren gingen. Reden — gebrek aan synchronisatie in de eigenschap, ondanks dat de applicatie multi-threaded was.
Verhaal
Windows Forms-applicatie: In het project werd het werken met de database in Singleton geplaatst, maar luie initialisatie werd niet geïmplementeerd. Bij het opstarten van de applicatie vond er een zware verbinding plaats, waardoor de UI-laadtijd voor iedereen vertraagd werd.
Verhaal
Plug-in voor journalistenplatform: Probeer een statische variabele in de module voor Singleton te gebruiken, niet beschermd tegen multi-threading, resulterend in meerdere instanties van de e-mailverzendhandler tijdens een piekbelasting, wat leidde tot duplicerende e-mails.