在我的多线程 asmx Web 服务中,我有一个我自己的 SystemData 类型的类字段 _allData,它由少数组成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);
产生警告“对 volatile 字段的引用不会被视为 volatile” 我应该怎么想?