Sobes.tech
Junior

Jaká je funkce klíčového slova lock v jazyce C#?

sobes.tech AI

Odpověď od AI

Klíčové slovo lock se používá k synchronizaci přístupu ke zdrojům v vícevláknových aplikacích. Zajišťuje, že pouze jedno vlákno může v daném okamžiku spustit kód uvnitř bloku lock.

Princip fungování:

  1. lock přijímá jako argument objekt, který se používá jako mutex (monitor).
  2. Před vykonáním kódu uvnitř bloku lock se vlákno pokusí získat výlučné uzamčení na daném objektu.
  3. Pokud je uzamčení volné, vlákno ho získá a vykoná kód.
  4. Pokud je uzamčení obsazené jiným vláknem, aktuální vlákno se zablokuje (přepne do stavu čekání), dokud uzamčení nebude uvolněno.
  5. Při opuštění bloku lock (i při výjimce) je uzamčení automaticky uvolněno.

Používá se k ochraně sdílených zdrojů, jako jsou pole tříd, kolekce nebo jiné objekty, ke kterým mohou přistupovat současně více vláken, aby se zabránilo závodním podmínkám (race conditions) a zajistila integrita dat.

Příklad použití:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Objekt pro synchronizaci

    public void Increment()
    {
        lock (_lockObject) // Výlučný přístup k bloku kódu
        {
            _counter++; // Bezpečná změna sdíleného zdroje
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Také při čtení výlučný přístup
        {
            return _counter;
        }
    }
}

Důležité body:

  • Objekt pro zamčení musí být odkazového typu a obvykle soukromé pole (readonly), aby se zabránilo zásahu zvenčí.
  • Vyvarujte se zamykání typů jako string, this nebo typeof(TypeName), protože mohou být sdílené nebo přístupné zvenčí, což může vést k deadlockům nebo nesprávnému chování.
  • lock je syntaktický cukr pro použití metod třídy Monitor.