本帖最后由 ilovecomputer66 于 2023-5-21 09:34 编辑
我用C#写类似java的AtomicInteger类。第3行这个volatile 该不该加?chatGPT上让他找别人写的这个代码,是没有加的。第一次问他,难道不该加volatile么?他说原子操作,不用加。我反问,那你get方法就直接拿_value的值,又不是原子操作,多线程不加volatile,难道不会读到脏值?他说他错了,应该加。那我让他再写一遍,它又不加,和神经病似的
反正我觉得是得加这个volatile,或者用Interlocked.Read方法返回_value的值(但C#只提供long型的Interlocked.Read作为返回值,又要转类型,又因为原子操作比可见性还要重,相比就不如加volatile
不知道大家怎么看, 觉得该加么
[C#] 纯文本查看 复制代码 public class AtomicInteger
{
private volatile int _value;
public int Value
{
get { return _value; }
set { Interlocked.Exchange(ref _value, value); }
}
public int GetAndIncrement()
{
return Interlocked.Increment(ref _value) - 1;
}
public int GetAndDecrement()
{
return Interlocked.Decrement(ref _value) + 1;
}
public int IncrementAndGet()
{
return Interlocked.Increment(ref _value);
}
/// <summary>
/// 通过原子操作,对原值进行增减
/// </summary>
/// <param name="delta">要增减的值,增加为正数,减少为负数</param>
/// <returns>进行增减后的值</returns>
public int ChangeAndGet(int delta)
{
return Interlocked.Add(ref _value, delta);
}
public int DecrementAndGet()
{
return Interlocked.Decrement(ref _value);
}
} |