Met de ontwikkeling van multithreadprogrammering ontstond het probleem van gelijktijdige toegang van meerdere threads tot dezelfde gegevens. Dit leidde tot onvoorspelbare bugs en beschadigingen van de programmastatus.
In Visual Basic .NET wordt een exclusieve vergrendelingsmechanisme toegepast met behulp van de constructie SyncLock, om ervoor te zorgen dat slechts één thread tegelijkertijd bepaalde code uitvoert.
De oplossing is om SyncLock (of Monitor.Enter/Exit) rond de code voor toegang tot gedeelde bronnen te gebruiken, om het object te vergrendelen tijdens de uitvoering van de kritieke sectie.
Codevoorbeeld:
Private Shared Counter As Integer = 0 Private Shared ReadOnly CounterLock As New Object() Public Shared Sub IncrementCounter() SyncLock CounterLock Counter += 1 End SyncLock End Sub
Belangrijke kenmerken:
Kan een integer, string of Nothing worden gebruikt als vergrendelingstoken?
Nee, SyncLock vereist een referentieobject. Strings worden niet aanbevolen, omdat ze intern kunnen worden opgeslagen, wat kan leiden tot onopzettelijke overlapping van vergrendelingen.
Wat gebeurt er als verschillende threads verschillende objecten gebruiken om één variabele te vergrendelen?
Er is geen synchronisatie, en er ontstaat een racecondition – je moet strikt hetzelfde object vergrendelen.
Moet ik de vergrendeling handmatig vrijgeven na het verlaten van de SyncLock-blok?
Nee, de ontgrendeling gebeurt automatisch bij het verlaten van de blok, zelfs bij uitzonderingen.
In de code worden strings gebruikt voor SyncLock, en verschillende delen van het programma gebruiken dezelfde stringliteral. Hierdoor kunnen verschillende vergrendelingen elkaar overlappen en onverwachte deadlocks veroorzaken.
Voordelen:
Nadelen:
Voor elke kritieke sectie wordt een apart ReadOnly-object gedeclareerd. Slechts het minimale, echt noodzakelijke deel van de code wordt vergrendeld.
Voordelen:
Nadelen: