Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
69 of 1492 menu
◀ ▶

Оператор lock

Конструкция lock принимает выражение ссылочного типа и выполняет блок кода, пока удерживается монитор этого объекта. После выхода из блока блокировка снимается. В качестве аргумента нужен объект-ссылка, а не значимый тип вроде int. Ключевое слово lock относится к синхронизации потоков, а не к типу Lock из API.

Синтаксис

lock (объект) { // защищённый код }

Пример

Давайте выполним код внутри lock:

using System; class Program { static void Main() { object gate = new object(); lock (gate) { Console.WriteLine("abcde"); } } }

Результат выполнения кода:

"abcde"

Пример

Давайте изменим переменную под блокировкой:

using System; class Program { static void Main() { object gate = new object(); int num = 0; lock (gate) { num = 12; } Console.WriteLine(num); } }

Результат выполнения кода:

12

Пример

Давайте дважды войти в lock с одним объектом:

using System; class Program { static void Main() { object gate = new object(); lock (gate) { Console.WriteLine("first"); } lock (gate) { Console.WriteLine("second"); } } }

Результат выполнения кода:

"first" "second"

Пример

Давайте использовать отдельный объект только для синхронизации:

using System; class Program { static readonly object gate = new object(); static void Main() { lock (gate) { Console.WriteLine("12345"); } } }

Результат выполнения кода:

"12345"

Смотрите также

  • класс Lock,
    который держит объект блокировки
  • класс Monitor,
    который занимает и отпускает блокировку
  • класс SemaphoreSlim,
    который выдаёт ограниченное число допусков
  • класс Interlocked,
    который меняет значение без гонки
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить