c# - 避免在锁内和锁外重复if语句

标签 c# multithreading .net-4.0 thread-safety

下面的代码是我要完成的工作的非常简化的示例。

 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/

相关文章:

c# - 如何在 C# 中将字符串拆分为单词

c# - .NET Core 中的 wsHttpBinding 解决方法

multithreading - 如何修复 Java 绑定(bind) : UnsatisfiedLinkError?

java - 它是一种线程安全机制吗?

vb.net - Windows 打印机后台处理程序 setjob 功能不适用于 Windows-7?

multithreading - 多线程WMI调用-如何最好地处理此问题?

c# - .NET - WindowStyle = hidden 与 CreateNoWindow = true?

c# - ListView 中的换行符在 Vista/7 中有效,但在 XP 中无效

java - java线程的共享变量

asp.net-mvc-2 - 我应该在MVC View 中使用Url.Content()还是ResolveUrl()?