Die Referenzzuweisung ist atomar. Warum wird Interlocked.Exchange (ref Object, Object) benötigt?

In meinem Multithread-asmx-Webdienst hatte ich ein Klassenfeld _allData meines eigenen Typs SystemData, das aus wenigen bestehtList<T> undDictionary<T> markiert alsvolatile. Die Systemdaten (_allData) wird von Zeit zu Zeit aktualisiert und ich erstelle ein anderes Objekt mit dem NamennewData und füllen Sie seine Datenstrukturen mit neuen Daten. Wenn es fertig ist, weise ich es einfach zu

private static volatile SystemData _allData

public static bool LoadAllSystemData()
{
    SystemData newData = new SystemData();
    /* fill newData with up-to-date data*/
     ...
    _allData = newData.
} 

Dies sollte funktionieren, da die Zuweisung atomar ist und die Threads, die auf alte Daten verweisen, diese weiterhin verwenden und der Rest die neuen Systemdaten direkt nach der Zuweisung enthält. Aber mein Kollege hat das gesagt, anstatt es zu benutzenvolatile Stichwort und einfache Zuordnung sollte ich verwendenInterLocked.Exchange weil er sagte, dass es auf einigen Plattformen nicht garantiert ist, dass die Referenzzuweisung atomar ist. Außerdem: wenn ich erklärethe _allData Feld alsvolatile das

Interlocked.Exchange<SystemData>(ref _allData, newData); 

erzeugt Warnung "Ein Verweis auf ein flüchtiges Feld wird nicht als flüchtig behandelt" Was soll ich darüber denken?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage