c# - 为什么锁确保底层监视器被释放而直接使用监视器却没有?

标签 c# multithreading events synchronization locking

msdn文章Thread Synchronization (C# Programming Guide)指定:

lock (x)
{
    DoSomething();
}

相当于:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
    DoSomething();
}
finally
{
    System.Threading.Monitor.Exit(obj);
} 

然后是:

"Using the lock keyword is generally preferred over using the Monitor class directly, ... because lock insures that the underlying monitor is released, even if the protected code throws an exception"

这句话是否意味着最后一个使用监视器的代码片段不能确保“释放底层监视器,即使 protected 代码抛出异常”?
为什么?

好吧,我对相互矛盾的断言感到困惑“等效”和不(一种用法确保而另一种用法,等效,不)关于相同。

最佳答案

粗体文本所指的情况更像是这样:

Monitor.Enter(obj);
DoSomethingThatThrows();
Monitor.Exit(obj);

如果没有 try-finally,抛出异常将绕过 Monitor.Exit 调用。

关于c# - 为什么锁确保底层监视器被释放而直接使用监视器却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020064/

相关文章:

c# - lock(){} 是锁定资源,还是锁定一段代码?

python - 如何使用 PyQt 通知 Python 进程正在退出?

c# - 将 C# 类文件添加到项目的代码

c# - 正则表达式:匹配除括号内的所有单词(C#)

c# - ASP.Net Web 服务不会返回 JSON - 始终为 XML

c# - Entity Framework 引用属性

c# - 多个代码块被同一个对象锁定

java - 使用执行器运行多个线程时如何立即捕获错误?

javascript - JS/Jquery - 从 event.target 聚焦到下一个输入字段

javascript - 选择页面加载选项