当 Clear 尝试锁定 Build 已经锁定的同一个对象时,我预计以下代码会死锁:
void Main()
{
(new SiteMap()).Build();
}
class SiteMap
{
private readonly object _lock = new object();
public void Build()
{
lock (_lock)
{
Clear();
Console.WriteLine("Build");
}
}
public void Clear()
{
lock (_lock)
{
Console.WriteLine("Clear");
}
}
}
输出:
清除
构建
编辑 1
谢谢大家的回答。
如果我在 Clear 的锁内添加对 Build 的调用(保持其余代码相同):
public void Clear()
{
lock (_lock)
{
Build();
Console.WriteLine("Clear");
}
}
确实发生了死锁(或者至少我是这么认为的,LINQ Pad 崩溃了)。
根据您的回答,这不应该发生,因为它仍然是同一个线程。
谢谢!
最佳答案
在C#中,持有锁的线程可以无阻塞地进入同一个锁。
lock
语句,以及 Monitor class它建立在其上,是 reentrant在 .NET 中。
根据您的编辑进行编辑:
当您在 clear 中添加对 Build
的调用时,代码不会死锁 - 它递归地调用自身。它不是阻塞,而是永远运行(直到你最终遇到 StackOverflowException ),因为 Build
调用 Clear
调用 Build
再次调用 Clear
等....
关于c# - 为什么这段代码不会死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640903/