Sobes.tech
Junior

Kokia yra raktažodžio lock funkcija C# kalboje?

sobes.tech AI

Atsakymas iš AI

Raktinis žodis lock naudojamas daugiagijų programose išteklių sinchronizavimui. Jis garantuoja, kad tik viena srautas gali vykdyti lock bloko kodą tam tikru momentu:

Veikimo principas:

  1. lock priima kaip argumentą objektą, kuris naudojamas kaip mutexas (monitorius).
  2. Prieš vykdant lock bloko kodą, srautas bando gauti nurodyto objekto monopolį.
  3. Jei užraktas laisvas, srautas jį gauna ir vykdo kodą.
  4. Jei užraktas užimtas kitu srautu, dabartinis srautas blokuojamas (pereina į laukimo būseną), kol užraktas bus atlaisvintas.
  5. Išėjus iš lock bloko (net ir išimties atveju), užraktas automatiškai atlaisvinamas.

Naudojama bendriems ištekliams apsaugoti, tokiems kaip klasių laukai, kolekcijos ar kiti objektai, į kuriuos gali kreiptis keli srautai vienu metu, siekiant išvengti lenktynių sąlygų (race conditions) ir užtikrinti duomenų vientisumą:

Pavyzdys:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Sinchronizacijos objektas

    public void Increment()
    {
        lock (_lockObject) // Vienu metu prieiga prie kodo bloko
        {
            _counter++; // Saugi bendro ištekliaus keitimas
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Taip pat vienu metu skaitant
        {
            return _counter;
        }
    }
}

Svarbūs punktai:

  • Užrakinimo objektas turi būti nuorodos tipo ir dažniausiai privatūs laukai (readonly), siekiant išvengti išorės įsikišimo.
  • Venkite naudoti string, this ar typeof(TypeName) tipus, nes jie gali būti bendrinami arba prieinami išorėje, kas gali sukelti užrakinimo konfliktus (deadlocks) arba netinkamą veikimą.
  • lock yra sintaksinis cukrus Monitor klasės metodų naudojimui.