Mein Verständnis von C# sagt (dank Jeff Richter & Jon Skeet), dass Zuweisung "atomar" ist. Was nicht ist, ist, wenn wir mischen liest & schreibt (Inkrement/Dekrement) und daher müssen wir Methoden auf die Interlocked verwenden. Wenn wir nur lesen und zuweisen, sind dann beide Operationen atomar?
`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;
}`