gpt4 book ai didi

c# - 为什么这段代码不会死锁?

转载 作者:太空狗 更新时间:2023-10-29 22:09:35 27 4
gpt4 key购买 nike

当 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com