Полагаю, вы рассматриваете такой код:
using System;
using System.Threading;
class Test
{
static int x = 1;
static int y = 2;
static void Main()
{
x = Interlocked.Exchange(ref y, 5);
}
}
В этом случае нет, операция не является атомарной.В IL есть два отдельных действия:
- Вызов метода
- Копирование значения из условного стека в поле
Это будет полностьювозможно, что другой поток «увидит» y
станет 5 до того, как возвращаемое значение Interlocked.Exchange
будет сохранено в x
.
Лично, если бы я искал что-то, где вам нужно несколько значений полейизмененный атомарно, я бы рассматривал блокировки вместо атомарных операций без блокировки.