Что выведет код Junior Потоки и синхронизация обновлено

Interlocked против обычного инкремента

Вопрос

Что выведет программа (.NET 8)? По строке на каждый вывод.

int safe = 0;
Parallel.For(0, 100_000, _ => Interlocked.Increment(ref safe));
Console.WriteLine(safe);

var sum = 0L;
var locker = new object();
Parallel.For(1, 101, i => { lock (locker) sum += i; });
Console.WriteLine(sum);

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 100000, 5050. Interlocked.Increment атомарен, поэтому ровно 100000 увеличений.

Что выведет

100000
5050

Разбор

Interlocked.Increment атомарен, поэтому ровно 100000 увеличений. Сумма чисел от 1 до 100 под lock тоже без потерь: 5050. С обычным safe++ первое число было бы случайным и обычно меньше.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме