尝试和锁定问题

12

我有一个问题...如果我的代码像下面这样,这样可以吗:

try 
{ 
    lock(programLock) 
    {
         //some stuff 1
    }
}
catch(Exception ex) { //stuff 2 }

我很好奇如果"一些东西 1"引发了异常,是否programLock仍然保持锁定状态?

5个回答

15

不会,锁将被释放,锁大致等同于这个:

try
{
    Monitor.Enter(programLock);
    // some stuff 1
}
finally
{
    Monitor.Exit(programLock);
}

(如果抛出异常,Monitor.Exit 将在退出 lock 语句块的作用域时自动调用)


6

Lock()仅仅是一个

try
{
   Monitor.Enter(...);
}
finally
{
   Monitor.Exit(....);
}

所以它已经处理好了。

4

来自MSDN文档

"... lock或SyncLock确保即使受保护的代码引发异常,底层监视器也会被释放。"

注意:您可以使用using块创建自己的异常安全块以执行任意操作,.net的版本RAII习惯用法。


2

不带锁括号,将始终解锁。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接