下面的代码是我要完成的工作的非常简化的示例。
private object _highestLevelLock = new object();
private int _highestValue;
private void SetHighestValue()
{
var random = new Random();
var next = random.Next(0, 100);
if (next > _highestValue)
{
lock (_highestLevelLock)
{
if(next > _highestValue)
_highestValue = next;
}
}
}
即,我有一个变量,该变量保存到目前为止所遇到的最大整数。 SetHighestValue()可以由多个线程访问。
如果生成的随机整数大于当前最大的整数,我将更新_highestValue。
我的问题是,如果next> maximumValue,如何避免两次检查?如果我从锁内部将其删除,则在此线程设置该值之前,存在_highestValue设置为更高值的风险,并且在这种情况下_highestValue将不准确。
我知道我可以摆脱锁定之外的if语句,但是我不想不必要地锁定。
有没有更好的方法可以做到这一点?可能是锁定和/或使用互锁 namespace 的某种组合?
在某种程度上相关的注释上,_highestValue应该是可变的吗?即使是这样,我认为这也不会帮助我解决我的问题。
谢谢!
最佳答案
您所描述的是test and test and set的一种情况,是一种处理事情的非常有效的方法。要回答您的问题,除非将条件封装在函数中,否则就无法摆脱代码重复。
关于c# - 避免在锁内和锁外重复if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682156/