在我的多线程ASMX web服务,我有我自己的类型SystemData的类别字段_allData它由数List<T>和Dictionary<T>标记为volatile.系统data(_allData)会偶尔刷新一次,我会通过创建另一个被调用的对象newData并用新数据填充它的数据结构来实现.当它完成后我就分配了
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Run Code Online (Sandbox Code Playgroud)
这应该工作,因为赋值是原子的,并且具有对旧数据的引用的线程继续使用它,而其余的在分配之后具有新的系统数据.然而,我的同事说,volatile我应该使用,而不是使用关键字和简单的InterLocked.Exchange分配,因为他说在某些平台上,不能保证引用赋值是原子的.另外:当我宣布the _allData字段volatile的
Interlocked.Exchange<SystemData>(ref _allData, newData);
Run Code Online (Sandbox Code Playgroud)
产生警告"对易变场的引用不会被视为不稳定的"我应该怎么看待这个?
我正在C#中构建一个多线程缓存,它将包含一个Car对象列表:
public static IList<Car> Cars {get; private set;}
Run Code Online (Sandbox Code Playgroud)
我想知道在没有锁定的情况下更改线程中的引用是否安全?
例如
private static void Loop()
{
while (true)
{
Cars = GetFreshListFromServer();
Thread.Sleep(SomeInterval);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,它归结为是否为汽车分配新的参考是原子的还是不是我想的.
如果不是,我显然必须为我的汽车使用私人领域,并锁定获取和设置.