我在代码审查期间被建议做

bool acquiredLock = false;
try {
    Monitor.TryEnter(lockObject, 500, ref acquiredLock);
    if (acquiredLock) {
        // do something
    }
    else {
        // fallback strategy
   }
}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}

而不是更简单的
if (Monitor.TryEnter(lockObject, 500)) {
      try {
          // do something...
      }
      finally {
          Monitor.Exit(lockObject);
      }
} else {
     // fallback strategy
}

它有什么区别?第一个代码如何不显示错误而第二个代码会显示错误?

最佳答案

假设在你的第二个片段中你实际上调用了 Monitor.Exit ,差异在 the documentation 中有解释:



换句话说,对于您的第二个代码段,在获取锁之后但在方法返回之前抛出异步异常(例如线程被中止)可能是可行的。即使使用 finally 块,您也无法轻松判断是否需要释放锁。使用 ref 参数,“获得的监视器”和“ref 参数设置为 true ”操作是原子的 - 当方法退出时,变量不可能有错误的值,但是它会退出。

从 C# 4 开始,当面向支持此重载的平台时,这也是 C# 编译器生成的代码。

关于c# - Monitor.TryEnter(lockObject, timeout) 过载不安全吗? (。网),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28703627/

10-12 05:51