Sobes.tech
Junior
130
questionbank

Какова функция ключевого слова lock в языке C#?

Ответ от нейросети

sobes.tech AI

Ключевое слово lock используется для синхронизации доступа к ресурсам в многопоточных приложениях. Оно гарантирует, что только один поток может выполнять код внутри блока lock в определенный момент времени.

Принцип работы:

  1. lock принимает в качестве аргумента объект, который используется как мьютекс (монитор).
  2. Перед выполнением кода внутри блока lock, поток пытается получить монопольную блокировку на указанный объект.
  3. Если блокировка свободна, поток получает ее и выполняет код.
  4. Если блокировка занята другим потоком, текущий поток блокируется (переходит в состояние ожидания), пока блокировка не будет освобождена.
  5. После выхода из блока 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.