我有一个简单的类,例如:
public class XXX
{
double val1;
double val2;
double delta;
public void SetValues(double v1, double v2)
{
val1 = v1;
val2 = v2;
delta = val1 - val2;
}
public double Val1 { get { return val1; } }
public double Val2 { get { return val2; } }
public double Delta { get { return delta; } }
}
,一个用于设置值的线程和多个读取值的线程。因此,可以使用lock()
使所有读取和写入不间断。但我知道同步永远不会实现,总是有Val1 - Val2
可能不等于Delta
我不太关心的机会。我更关心的是通过 getter 获得稳定的值。然而lock()
,这种情况是昂贵的,因为大多数读者都会工作。
我想到的下一个最好的事情是使用Interlocked.Exchange()
public void SetValues(double v1, double v2)
{
Interlocked.Exchange(ref val1, v1);
Interlocked.Exchange(ref val2, v2);
Interlocked.Exchange(ref delta, v1 - v2);
}
public double Val1 {
get
{
double val = 0;
Interlocked.Exchange(ref val, val1);
return val;
}
}
但是代码对我来说似乎很愚蠢。我不知道。
那么lock()
有意义吗?我应该使用Interlocked.Exchange()
性能增益吗?或者我还能做什么?