Das Singleton-Muster gewährleistet, dass eine Klasse nur eine Instanz hat und bietet globalen Zugriff darauf. In VB.NET wird oft ein privater Konstruktor und eine statische Eigenschaft verwendet, um die einzige Instanz zu speichern:
Public Class Singleton Private Shared _instance As Singleton Private Sub New() ' Privater 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
Thread-Sicherheit:
In einer Multi-Thread-Umgebung kann es zur Erzeugung von zwei Instanzen bei gleichzeitigen Zugriffen kommen. Lösung: Verwendung von Sperren oder der Konstruktion Lazy(Of T):
' Faule thread-sichere Implementierung 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
Unterschied:
Wie gefährlich ist dieser Code für die Implementierung von 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
Antwort: In einer Mehr-Threads-Umgebung kann es passieren, dass zwei Threads gleichzeitig sehen, dass _instance Nothing ist, und beide ein Objekt erstellen. Daher ist dieser Ansatz nicht vollständig thread-sicher. Es wird empfohlen, Lazy(Of T) oder SyncLock zur Sperrung zu verwenden.
Geschichte
ERP-System: Der Singleton-Logger wurde beim Start aus Diensten manchmal doppelt erstellt, wodurch Protokolle verloren gingen. Grund war das Fehlen der Synchronisation in der Eigenschaft, obwohl die Anwendung multithreaded war.
Geschichte
Windows Forms-Anwendung: Im Projekt wurde die Arbeit mit der Datenbank in einen Singleton herausgenommen, aber die faule Initialisierung nicht implementiert. Beim Start der Anwendung gab es eine schwere Verbindung, die die Benutzeroberfläche für alle verlangsamte.
Geschichte
Plugin für eine Journalistenplattform: Versucht, eine statische Variable im Modul für Singleton zu verwenden, die nicht gegen gleichzeitigen Zugriff geschützt war, was dazu führte, dass in der heißen Phase der Last mehrere Instanzen des E-Mail-Verteilungshandlers erstellt wurden, was zu doppelten E-Mails führte.