当前位置: 首页 > 编程语言 > C#

为什么这个lock语句不起作用?分享

时间:2023-04-10 23:43:49 C#

为什么这个lock语句不起作用?类程序{静态对象测试=newobject();staticvoidMain(string[]args){newProgram().test2();控制台.ReadKey();}publicvoidtest1(){lock(test){Console.WriteLine("test1");}}publicvoidtest2(){锁(测试){test1();Console.WriteLine("test2");}}}上面的代码应该是先在test2()的lock语句中完成语句,然后再去test1()?(即输出不应该是这样的吗?:test2test1)监视器可以重新进入同一个线程。避免意外死锁非常重要,如果没有这种行为,您的代码将严格冻结。互斥体也是可重入的,而信号量不是。实现非常简单。监视器存储两条信息。进入它的线程的所有者Thread.ManagedId和一个计算它进入次数的计数器。所以第一个锁可以进入,因为它不被拥有,它将所有者设置为你的线程并将计数设置为1。第二个锁被允许进入,并且由于线程ID匹配,计数增加到2。最后第二次加锁,计数再次减为1。在第一个结束时,计数减少到0,所有者被重置。不。事件顺序(指示调用堆栈或逻辑操作的标识)是:重要的是要注意监控器是可重入的——如果当前线程已经拥有监控器,另一个获取它的尝试只会增加计数,而不是阻塞。如果监视器不是可重入的,输出就不会是“test2,test1”——它只会是一个死锁。在单线程场景中不应使用锁定。它的用途是用于对同一方法或对象实例的跨线程调用。您注意到的行为是正常的。当两个或多个线程可以并发访问资源时,您通常希望同步对资源(变量、集合等)的访问。以上是C#学习教程:为什么这个加锁语句不起作用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: