ProgrammierungBackend-Entwickler (VB.NET)

Wie wird das Singleton-Designmuster in Visual Basic implementiert, was sollte man für die Thread-Sicherheit beachten und was ist der Unterschied zwischen der klassischen und der Lazy-Implementierung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Das klassische Singleton erstellt die Instanz beim ersten Zugriff, erfordert jedoch manuelle Synchronisierung.
  • Die "faule" Variante nutzt integrierte Mechanismen von .NET zur Erstellung der Instanz auf thread-sichere Weise.

Fangfrage.

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.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.