我在代码审查期间被建议做
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/