В моей многопоточной веб-службе 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);
выводит предупреждение "ссылка на нестабильное поле не будет считаться изменчивой". Что я должен думать об этом?