Con lo sviluppo della programmazione multithreading è emerso il problema dell'accesso simultaneo di più thread agli stessi dati. Questo portava a bug imprevedibili e danneggiamenti dello stato del programma.
In Visual Basic .NET si utilizza un meccanismo di blocco esclusivo attraverso la costruzione SyncLock, per garantire che solo un thread esegua contemporaneamente un determinato codice.
La soluzione è utilizzare SyncLock (o Monitor.Enter/Exit) attorno al codice di accesso alle risorse condivise, per bloccare l'oggetto durante l'esecuzione della sezione critica.
Esempio di codice:
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
Caratteristiche chiave:
È possibile utilizzare un valore di tipo Integer, String o Nothing come token di blocco?
No, SyncLock richiede un oggetto di riferimento. Le stringhe non sono consigliate, poiché potrebbero subire interning, il che porterebbe a sovrapposizioni implicite dei blocchi.
Cosa succede se thread diversi utilizzano oggetti diversi per bloccare una variabile?
Non ci sarà alcuna sincronizzazione, e si verificherà una corsa dei thread — è necessario bloccare rigorosamente lo stesso oggetto.
È necessario rilasciare manualmente il blocco dopo essere usciti dal blocco SyncLock?
No, il rilascio avviene automaticamente all'uscita dal blocco, anche in caso di eccezioni.
Nel codice vengono utilizzate stringhe per SyncLock, e diverse parti del programma utilizzano gli stessi letterali di stringa. Di conseguenza, i blocchi diversi si sovrappongono e si verificano inattese reciproche blocchi (deadlocks).
Vantaggi:
Svantaggi:
Per ogni sezione critica viene dichiarato un oggetto ReadOnly separato. Viene bloccata solo la parte minima ed effettivamente necessaria del codice.
Vantaggi:
Svantaggi: