CompareExchange в C#
Метод Interlocked.CompareExchange (ref location, newValue, comparand) записывает newValue только если location сейчас равен comparand; возвращает прежнее значение location до попытки обмена.
Так обновляют одно поле без блокировки. Если другой поток уже изменил поле, обмен не проходит: метод возвращает прежнее значение, и попытку повторяют.
Заменим 5 на 9, только пока в slot действительно 5. prev - это старое значение, slot уже стал 9. Если бы ожидаемым было 0, поле не изменилось бы: текущее значение с ним не совпало:
int slot = 5;
int prev = Interlocked.CompareExchange(ref slot, 9, 5);
Console.WriteLine(prev); // выведет 5
Console.WriteLine(slot); // выведет 9
Заведите поле со значением 0. Замените его на 5 только если сейчас там 0, и выведите итоговое значение.