c# – 引用分配线程安全吗?

我在C#中构建一个多线程缓存,它将持有一个Car对象的列表:

public static IList<Car> Cars {get; private set;}

我想知道是否可以安全地更改线程中没有锁定的引用?

例如

private static void Loop()
{
  while (true)
  {
    Cars = GetFreshListFromServer();
    Thread.Sleep(SomeInterval);
  }
}

基本上,归根结底是给汽车分配一个新的引用是原子还是不是我猜。

如果不是,我显然必须使用私人领域为我的车,并锁定获取和设置。

最佳答案
是的,参考更新保证在语言规范中是原子的。

5.5 Atomicity of variable references

Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic.

然而在一个紧的循环中你可能会被寄存器缓存咬。在这种情况下不可能,除非你的方法调用是内联的(这可能发生)。我个人地添加锁定,使它简单和可预测,但volatile也可以帮助这里。请注意,全线程安全性不仅仅是原子性。

在缓存的情况下,我会看Interlocked.CompareExchange,个人,即尝试更新,但如果失败重做从头开始的工作(从新值开始),然后重试。

转载注明原文:c# – 引用分配线程安全吗? - 代码日志