小编sta*_*ker的帖子

为什么这段代码没有死锁?

当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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

明确

建立

编辑1

谢谢大家的答案.

如果我在Clear的锁内添加对Build的调用(保持其余的代码相同):

public void Clear()
{
    lock (_lock)
    {
        Build();

        Console.WriteLine("Clear");
    }
}
Run Code Online (Sandbox Code Playgroud)

确实发生了死锁(或者至少就是我认为的那样,LINQ Pad崩溃).

根据你的答案,这不应该发生,因为它仍然是相同的线程.

谢谢!

c# deadlock locking thread-safety

5
推荐指数
2
解决办法
168
查看次数

标签 统计

c# ×1

deadlock ×1

locking ×1

thread-safety ×1