锁内的c#函数(obj)

时间:2010-07-22 15:18:42

标签: c#

对于下面的示例,锁定是否会在执行i ++之前释放?换句话说,当在锁内调用函数时会释放锁吗?

lock (lockerobject /*which is static*/)
{
   call2anotherFunction();
   i++;
}

4 个答案:

答案 0 :(得分:6)

在退出lock块之前,不会释放锁定。 lock不知道或不关心您在块内执行的代码。

事实上,作为一般规则,在一个区块内发生的事情并不为它所知道的是什么:

if (condition)
{
    // The if doesn't know what happens in here
}

using (var reader = XmlReader.Create(url))
{
    // using doesn't care what happens in here
    throw new Exception("Unless...");
} // Dispose will be called on reader here

但只会调用Dispose,因为块退出,而不仅仅是因为throw内部发生了。

答案 1 :(得分:6)

不,仅当代码执行离开lock块的范围时才会释放锁。

答案 2 :(得分:3)

锁定将被保持,直到您的执行点离开结束大括号。因此,当i ++执行时,仍然会保持锁定。

如果cal2anotherfunction抛出异常,i ++将永远不会被执行,当堆栈从创建锁定的函数中退出时,锁定将被释放(锁定实际上是try-finally)

答案 3 :(得分:2)

不,它不会被释放。如果要释放它,请在函数调用后启动锁定。

call2anotherFunction();
lock (lockerobject which is static)
{
   i++;
}