Sobes.tech
Middle

Czym są lock-ery w C#?

sobes.tech AI

Odpowiedź od AI

lock w C# jest używany do zapewnienia wyłącznego dostępu do bloku kodu. Gwarantuje, że tylko jeden wątek może wykonywać ten blok jednocześnie, zapobiegając warunkom wyścigu (race conditions) podczas pracy z zasobami współdzielonymi.

private static readonly object _lockObject = new object(); // Obiekt do synchronizacji

public void AccessSharedResource()
{
    lock (_lockObject) // Blokada obiektu
    {
        // Sekcja krytyczna: kod wymagający wyłącznego dostępu
        // Praca z zasobem współdzielonym (np. zmiana zmiennej)
    } // Blokada jest automatycznie zwalniana po wyjściu z bloku
}

Alternatywy i powiązane pojęcia:

  • Monitor: Zapewnia bardziej szczegółową kontrolę nad synchronizacją, w tym metody Wait, Pulse, PulseAll.
  • Mutex: Używany do synchronizacji między procesami, a także między wątkami w tym samym procesie.
  • Semaphore/SemaphoreSlim: Ogranicza liczbę wątków, które mogą jednocześnie uzyskać dostęp do zasobu.
  • ReaderWriterLockSlim: Pozwala wielu wątkom czytać jednocześnie, ale tylko jednemu pisać.

Wybór mechanizmu blokowania zależy od konkretnego zadania synchronizacyjnego. lock jest skrótem od użycia Monitor.Enter i Monitor.Exit i nadaje się do większości prostych przypadków synchronizacji w obrębie tego samego procesu.