gpt4 book ai didi

c# - 为什么这个 lock 语句不起作用?

转载 作者:太空狗 更新时间:2023-10-29 23:54:30 27 4
gpt4 key购买 nike

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");
}
}
}

上面的代码是否应该首先完成 test2() 的 lock 语句中的语句然后转到 test1()?(即输出不应该是这样的吗?:测试2测试1)

最佳答案

没有。事件的顺序(标识代表调用堆栈或逻辑操作)是:

  • 主要调用测试 2
    • test2 尝试获取与测试对象关联的监视器(lock 语句的开始)
      • Monitor 目前无人拥有。成功!
      • 当前线程现在“拥有”该监视器,计数为 1
    • test2 调用 test1
      • test1 尝试获取测试对象的监视器(lock 语句的开始)
        • Monitor 当前拥有...但属于当前线程。成功!
        • 当前线程仍然“拥有”监视器,计数为 2
      • test1 打印“test1”
      • test1 释放监视器(lock 语句结束)
        • 当前线程仍然“拥有”监视器,计数为 1
      • 测试 1 返回
    • test2 打印“test2”
    • test2 释放监视器(lock 语句结束)
      • 监视器现在是无主的(所以另一个线程可以获取它)
    • test2 返回

重要的是要注意监视器可重入 - 如果当前线程已经拥有监视器,那么再次尝试获取它只会增加计数,而不是阻塞。

如果监视器不是可重入的,输出就不会是“test2, test1”——它只会是死锁。

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

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