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:
lockprzyjmuje jako argument obiekt, który jest używany jako mutex (monitor).- Przed wykonaniem kodu wewnątrz bloku
lock, wątek próbuje uzyskać wyłączny blokadę na wskazanym obiekcie. - Jeśli blokada jest wolna, wątek ją uzyskuje i wykonuje kod.
- Jeśli blokada jest zajęta przez inny wątek, bieżący wątek zostaje zablokowany (przechodzi w stan oczekiwania), aż blokada zostanie zwolniona.
- 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,thislubtypeof(TypeName), ponieważ mogą być współdzielone lub dostępne z zewnątrz, co może prowadzić do zakleszczeń (deadlocks) lub nieprawidłowego działania. lockjest cukrem składniowym dla użycia metod klasyMonitor.