Sobes.tech
Junior

Jaka jest funkcja słowa kluczowego lock w języku C#?

sobes.tech AI

Odpowiedź od AI

Słowo kluczowe lock jest używane do synchronizacji dostępu do zasobów w aplikacjach wielowątkowych. Zapewnia, że tylko jeden wątek może wykonać kod wewnątrz bloku lock w danym momencie.

Zasada działania:

  1. lock przyjmuje jako argument obiekt, który jest używany jako mutex (monitor).
  2. Przed wykonaniem kodu wewnątrz bloku lock, wątek próbuje uzyskać wyłączny blokadę na wskazanym obiekcie.
  3. Jeśli blokada jest wolna, wątek ją uzyskuje i wykonuje kod.
  4. Jeśli blokada jest zajęta przez inny wątek, bieżący wątek zostaje zablokowany (przechodzi w stan oczekiwania), aż blokada zostanie zwolniona.
  5. Po wyjściu z bloku lock (nawet w przypadku wyjątku), blokada jest automatycznie zwalniana.

Służy do ochrony zasobów współdzielonych, takich jak pola klas, kolekcje lub inne obiekty, do których mogą odwoływać się jednocześnie różne wątki, aby uniknąć warunków wyścigu i zapewnić integralność danych.

Przykład użycia:

public class SharedResource
{
    private int _counter;
    private readonly object _lockObject = new object(); // Obiekt do synchronizacji

    public void Increment()
    {
        lock (_lockObject) // Wyłączny dostęp do bloku kodu
        {
            _counter++; // Bezpieczna modyfikacja wspólnego zasobu
        }
    }

    public int GetCounter()
    {
        lock (_lockObject) // Wyłączny dostęp także podczas odczytu
        {
            return _counter;
        }
    }
}

Ważne punkty:

  • Obiekt do blokady musi być typu referencyjnego i zazwyczaj prywatnym polem (readonly), aby zapobiec zewnętrznej ingerencji.
  • Unikaj blokowania typów takich jak string, this lub typeof(TypeName), ponieważ mogą być współdzielone lub dostępne z zewnątrz, co może prowadzić do zakleszczeń (deadlocks) lub nieprawidłowego działania.
  • lock jest cukrem składniowym dla użycia metod klasy Monitor.