私の C# の理解では、(Jeff Richter と Jon Skeet のおかげで) 代入は「アトミック」であると言えます。そうでないのは、読み取りと書き込み (インクリメント/デクリメント) が混在しているため、Interlocked でメソッドを使用する必要がある場合です。読み取りと割り当てのみの場合、両方の操作はアトミックになりますか?
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;
}