我对 C# 的理解(感谢 Jeff Richter 和 Jon Skeet)认为赋值是“原子的”。不同的是,当我们混合读取和写入(递增/递减)时,因此我们需要在互锁上使用方法。如果只有读取和分配,这两个操作都是原子操作吗?
public class Xyz
{
private volatile int _lastValue;
private IList<int> AvailableValues { get; set; }
private object syncRoot = new object();
private Random random = new Random();
//Accessible by multiple threads
public int GetNextValue() //and return last value once store is exhausted
{
//...
var count = 0;
var returnValue = 0;
lock (syncRoot)
{
count = AvailableValues.Count;
}
if (count == 0)
{
//Read... without locking... potential multiple reads
returnValue = _lastValue;
}
else
{
var toReturn = random.Next(0, count);
lock (syncRoot)
{
returnValue = AvailableValues[toReturn];
AvailableValues.RemoveAt(toReturn);
}
//potential multiple writes... last writer wins
_lastValue = returnValue;
}
return returnValue;
}
我对 C# 的理解是(感谢
杰夫·里克特和乔恩·斯基特)
分配是“原子的”。
一般来说,赋值不是原子的。C# 规范仔细地指出了保证原子性的内容。参见第 5.5 节:
以下数据类型的读取和写入是原子的:bool、char、byte、sbyte、short、ushort、uint、int、float 和引用类型。此外,对具有前面列表中的基础类型的枚举类型的读取和写入也是原子的。其他类型(包括 long、ulong、double、decimal 以及用户定义类型)的读写不保证是原子的.
(强调是添加的。)
如果只有读取和分配这两个操作都是原子操作吗?
5.5 节再次回答了你的问题:
不保证原子读-修改-写
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)