Sobes.tech
Junior

Care este funcția cuvântului cheie lock în limbajul C#?

sobes.tech AI

Răspuns de la AI

Cuvântul cheie lock este utilizat pentru a sincroniza accesul la resurse în aplicațiile multi-thread. Asigură că doar un singur fir de execuție poate executa codul din interiorul blocului lock într-un moment dat.

Principiul de funcționare:

  1. lock acceptă ca argument un obiect utilizat ca mutex (monitor).
  2. Înainte de a executa codul din interiorul blocului lock, firul de execuție încearcă să obțină o blocare exclusivă pe obiectul specificat.
  3. Dacă blocarea este liberă, firul o obține și execută codul.
  4. Dacă blocarea este ocupată de alt fir, firul curent se blochează (trece în stare de așteptare) până când blocarea este eliberată.
  5. La ieșirea din blocul lock (chiar și în caz de excepție), blocarea este eliberată automat.

Este folosit pentru a proteja resursele comune, cum ar fi câmpurile de clasă, colecțiile sau alte obiecte la care pot accesa mai multe fire de execuție simultan, pentru a evita condițiile de cursă și a asigura integritatea datelor.

Exemplu de utilizare:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Obiect pentru sincronizare

    public void Increment()
    {
        lock (_lockObject) // Acces exclusiv la blocul de cod
        {
            _counter++; // Modificare sigură a resursei comune
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Acces exclusiv și la citire
        {
            return _counter;
        }
    }
}

Puncte importante:

  • Obiectul pentru blocare trebuie să fie de tip referință și, în general, un câmp privat (readonly) pentru a preveni intervenția externă.
  • Evitați blocarea tipurilor precum string, this sau typeof(TypeName), deoarece acestea pot fi partajate sau accesibile din exterior, ceea ce poate duce la deadlock-uri sau funcționare incorectă.
  • lock este un zahăr sintactic pentru utilizarea metodelor clasei Monitor.