在我的多线程 asmx Web 服务中,我有一个类 field _ allData,属于我自己的类型 SystemData,它由几个标记为 volatile
的 List<T>
和 Dictionary<T>
组成。系统数据(_allData
)每隔一段时间刷新一次,我通过创建另一个名为 newData
的对象并用新数据填充它的数据结构来做到这一点。完成后,我就分配任务
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
这应该可以工作,因为赋值是原子的,并且具有对旧数据的引用的线程继续使用它,而其他线程在赋值之后就具有新的系统数据。然而,我的同事说,我应该使用 InterLocked.Exchange
,而不是使用 volatile
关键字和简单的赋值,因为他说,在某些平台上,不能保证引用赋值是原子的。而且: 当我声明 the _allData
字段为 volatile
时,
Interlocked.Exchange<SystemData>(ref _allData, newData);
produces warning "a reference to a volatile field will not be treated as volatile" What should I think about this?