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

标签 c# locking thread-safety deadlock

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

相关文章:

c# - 锁定非静态字段有什么问题?锁定特定实例的正确方法是什么?

java - Spring 的 NumberFormat 线程安全

c - C 中函数指针的原子读/写?

c# - Umbraco ?umbDebugShowTrace=true 不工作

multithreading - 互斥锁 : what does "blocking" mean?

c# - 从自定义 header 中检索访问 token

c# - 锁定操作不起作用

c++ - 带有可变参数模板的 std::lock_guard

c# - 作为依赖项和不同的 publicKeyTokens 共享时的 RestSharp 错误

c# - 使用 HttpClient 通过 HTTP POST windows phone 8.1 上传图像和字符串