class Program
{
    static object test = new object();
    static void Main(string[] args)
    {
        new Program().test2();
        Console.ReadKey();
    }

    public void test1()
    {
        lock (test)
        {
            Console.WriteLine("test1");
        }
    }

    public void test2()
    {
        lock (test)
        {
            test1();
            Console.WriteLine("test2");
        }
    }
}
上面的代码是否应该先完成 test 2() 的 lock 语句中的语句,然后转到 test1() ?
(即输出不应该是这样的吗?:
测试2
测试1
)

最佳答案

监视器在同一线程上可重入。避免意外死锁非常重要,如果没有这种行为,您的代码将完全卡住。

Mutex 也是可重入的,而 Semaphore 则不是。

实现非常简单。 Monitor 存储两条信息。进入它的线程的所有者 Thread.ManagedId 和一个计数它被进入的次数的计数器。所以第一个锁可以进入,因为它没有被拥有,它将所有者设置为您的线程并且计数为 1。第二个锁被允许进入,因为线程 ID 匹配,计数增加到 2。在结束时第二个锁,计数再次减少到 1。在第一个结束时,计数递减到 0 并重置所有者。

关于c# - 为什么这个锁定语句不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11272616/

10-11 22:30