对于下面的示例,锁定是否会在执行i ++之前释放?换句话说,当在锁内调用函数时会释放锁吗?
lock (lockerobject /*which is static*/)
{
call2anotherFunction();
i++;
}
答案 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++;
}