присвоение ссылки является атомарным, так зачем нужен Interlocked.Exchange (ref Object, Object)?
В моем многопоточном веб-сервисе asmx у меня было поле класса _allData моего собственного типа SystemData, которое состоит из несколькихList<T>
а такжеDictionary<T>
помечен какvolatile
, Системные данные (_allData
) обновляется время от времени, и я делаю это, создавая другой объект с именемnewData
и заполнить его структуры данных новыми данными. Когда это сделано, я просто назначаю
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Это должно работать, поскольку назначение является атомарным, и потоки, имеющие ссылку на старые данные, продолжают его использовать, а остальные получают новые системные данные сразу после назначения. Однако мой коллега сказал, что вместо использованияvolatile
Ключевое слово и простое назначение, я должен использоватьInterLocked.Exchange
потому что он сказал, что на некоторых платформах не гарантируется, что присвоение ссылок является атомарным. Более того: когда я заявляюthe _allData
поле какvolatile
Interlocked.Exchange<SystemData>(ref _allData, newData);
выдает предупреждение "ссылка на изменчивое поле не будет рассматриваться как изменчивая" Что я должен думать об этом?