Оператор 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,
который меняет значение без гонки