ProgrammatieBackend ontwikkelaar (VB.NET)

Hoe wordt het Singleton-ontwerppatroon geïmplementeerd in Visual Basic, wat moet in overweging worden genomen voor threadveiligheid en wat is het verschil tussen de klassieke en luie (lazy) uitvoeringsvarianten?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • De klassieke Singleton creëert een instantie bij de eerste aanroep, maar vereist handmatige synchronisatie.
  • De "luie" variant maakt gebruik van ingebouwde mechanismen van .NET om de instantie threadveilig te creëren.

Vraag met een valstrik.

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.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


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.