Interlocked в C#
Метод Interlocked.Increment меняет int или long одной атомарной инструкцией процессора. Для простого счётчика посещений полная блокировка не нужна.
Если нужно атомарно поменять несколько связанных полей сразу, одного прибавления уже мало и нужна обычная блокировка.
Два потока параллельно увеличат visits, главный дождётся обоих и проверит итог. Оба прибавления учтены. Без атомарной операции при той же схеме результат мог бы быть 1 из-за гонки:
int visits = 0;
Thread a = new(() => Interlocked.Increment(ref visits));
Thread b = new(() => Interlocked.Increment(ref visits));
a.Start();
b.Start();
a.Join();
b.Join();
Console.WriteLine(visits); // выведет 2
Запустите три потока. В каждом атомарно прибавьте единицу к общему счётчику посещений. Дождитесь всех и выведите счётчик.