Sobes.tech
Junior

Qual è la funzione della parola chiave lock nel linguaggio C#?

sobes.tech AI

Risposta dell'AI

La parola chiave lock viene utilizzata per sincronizzare l'accesso alle risorse nelle applicazioni multithread. Garantisce che solo un thread possa eseguire il codice all'interno del blocco lock in un dato momento.

Principio di funzionamento:

  1. lock accetta come argomento un oggetto che viene usato come mutex (monitor).
  2. Prima di eseguire il codice all'interno del blocco lock, il thread tenta di ottenere un lock esclusivo sull'oggetto specificato.
  3. Se il lock è libero, il thread lo ottiene ed esegue il codice.
  4. Se il lock è occupato da un altro thread, il thread corrente si blocca (passa in stato di attesa) finché il lock non viene rilasciato.
  5. Uscendo dal blocco lock (anche in caso di eccezione), il lock viene rilasciato automaticamente.

Viene usato per proteggere risorse condivise, come campi di classi, collezioni o altri oggetti a cui possono accedere più thread contemporaneamente, per evitare condizioni di gara e garantire l'integrità dei dati.

Esempio di utilizzo:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Oggetto per la sincronizzazione

    public void Increment()
    {
        lock (_lockObject) // Accesso esclusivo al blocco di codice
        {
            _counter++; // Modifica sicura della risorsa condivisa
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Accesso esclusivo anche in lettura
        {
            return _counter;
        }
    }
}

Punti importanti:

  • L'oggetto per il lock deve essere di tipo riferimento e, di solito, un campo privato (readonly) per prevenire interferenze esterne.
  • Evitare di bloccare tipi come string, this o typeof(TypeName), poiché possono essere condivisi o accessibili dall'esterno, il che può portare a deadlock o funzionamento errato.
  • lock è uno zucchero sintattico per l'uso dei metodi della classe Monitor.