Junior
131
questionbank
Какова функция ключевого слова lock в языке C#?
Answer from AI
sobes.tech AI
Ключевое слово lock используется для синхронизации доступа к ресурсам в многопоточных приложениях. Оно гарантирует, что только один поток может выполнять код внутри блока lock в определенный момент времени.
Принцип работы:
lockпринимает в качестве аргумента объект, который используется как мьютекс (монитор).- Перед выполнением кода внутри блока
lock, поток пытается получить монопольную блокировку на указанный объект. - Если блокировка свободна, поток получает ее и выполняет код.
- Если блокировка занята другим потоком, текущий поток блокируется (переходит в состояние ожидания), пока блокировка не будет освобождена.
- После выхода из блока
lock(даже при исключении), блокировка автоматически освобождается.
Применяется для защиты общих ресурсов, таких как поля классов, коллекции или другие объекты, к которым могут одновременно обращаться несколько потоков, чтобы избежать состояний гонки (race conditions) и обеспечить целостность данных.
Пример использования:
public class SharedResource
{
private int _counter;
private readonly object _lockObject = new object(); // Объект для синхронизации
public void Increment()
{
lock (_lockObject) // Монопольный доступ к блоку кода
{
_counter++; // Безопасное изменение общего ресурса
}
}
public int GetCounter()
{
lock (_lockObject) // Монопольный доступ также при чтении
{
return _counter;
}
}
}
Важные моменты:
- Объект для блокировки должен быть ссылочного типа и, как правило, приватным полем (
readonly) для предотвращения внешнего вмешательства. - Избегайте блокировки типов
string,this, илиtypeof(TypeName), так как они могут быть совместно использованы или доступны извне, что может привести к взаимным блокировкам (deadlocks) или некорректной работе. lockявляется синтаксическим сахаром для использования методов классаMonitor.