Тип Lock в C#
В новых версиях .NET тип System.Threading.Lock заменяет произвольный объект, на котором потоки ждут своей очереди. В примере он стоит в операторе lock: вход в блок занимает блокировку, а выход из блока её отпускает.
Синхронизатор должен быть одним и тем же объектом для всех потоков. Lock - класс, поэтому ссылка стабильна. Если блокировать упакованный значимый тип, каждый вход получит свой монитор и секция перестанет быть общей.
Два потока добавят элементы в общий список под одной блокировкой. После ожидания обоих в списке два элемента, они не потерялись при параллельной записи:
using System.Threading;
List<int> items = new();
Lock gate = new();
void Add(int value)
{
lock (gate)
{
items.Add(value);
}
}
Thread a = new(() => Add(1));
Thread b = new(() => Add(2));
a.Start();
b.Start();
a.Join();
b.Join();
Console.WriteLine(items.Count); // выведет 2
В одном потоке добавьте в общий список строку "red", в другом - строку "blue". Дождитесь обоих и выведите, сколько элементов оказалось в списке.