试着锁定问题

时间:2011-04-06 15:35:41

标签: c# .net

我有一个问题..如果我有这样的事情就可以了:

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

我很好奇如果"some stuff 1"导致异常,programLock是否仍然保持锁定状态?

5 个答案:

答案 0 :(得分:15)

不,锁将被释放,锁大致相当于:

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

(意思是如果抛出异常,在退出lock语句的范围时将自动调用Monitor.Exit

答案 1 :(得分:6)

Lock()只是

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

所以它已经处理好了。

答案 2 :(得分:4)

来自msdn documentation

  

“...锁定或SyncLock确保了   底层监视器甚至被释放   如果受保护的代码抛出一个   异常“。

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

答案 3 :(得分:2)

没有。离开锁架将永远解锁。

答案 4 :(得分:2)

不,它不会保持锁定状态。

锁的“右括号”基本上是Monitor.Exit的finally子句。

请参阅此相关的StackOverflow问题。

Does a locked object stay locked if an exception occurs inside it?