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/