我对 C# 的理解说(感谢 Jeff Richter 和 Jon Skeet)赋值是“原子的”。当我们混合读取和写入(递增/递减)时不是这样,因此我们需要在 Interlocked 上使用方法。如果只有 Read & assign 这两个操作都是原子的吗?
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;
}