Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
锁内c#功能(obj)_C# - Fatal编程技术网

锁内c#功能(obj)

锁内c#功能(obj),c#,C#,对于下面的示例,在执行i++之前是否会释放锁?换句话说,当在锁内调用函数时,锁是否会被释放 lock (lockerobject /*which is static*/) { call2anotherFunction(); i++; } 不,不会发布的。如果要释放它,请在函数调用后启动锁 call2anotherFunction(); lock (lockerobject which is static) { i++; } 只有退出锁块,锁才会解除lock不知道或不关心您在

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

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

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

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

只有退出
块,锁才会解除
lock
不知道或不关心您在块内执行的代码

事实上,作为一般规则,块内发生的事情不为块外的人所知:

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


但是Dispose只会因为块已退出而被调用,而不仅仅是因为它内部发生了
抛出

否,只有当代码执行离开
块的范围时,锁才会被释放

锁定将一直保持,直到执行点离开右大括号。因此,当i++执行时,锁仍然保持不变

如果cal2anotherfunction抛出异常,i++将永远不会执行,并且当堆栈从创建锁的函数中展开时,锁将被释放(在锁周围有有效的try finally)

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