介绍
这篇文章主要介绍同线程锁语句递归不会死锁的方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
同线程锁语句递归不会死锁
答案如下:
根据线程安全的相关知识,分析以下代码,当调用测试方法时i> 10时是否会引起死锁?并简要说明理由。
<代码>公共空白测试(int i) { ,,锁(这) ,{ ,,,如果我比;10) ,,{ ,,,,,我,; ,,,,,测试(我); ,,,} ,,} }代码>
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个对象,那么死锁会发生)
当我看到这道题时,我心里只有两个答案,1,会发生死锁,2,不会。^ _ ^说了当没说。我觉得会发生死锁的理由是:同一线程只能进入锁语句一次,如果这个线程没有退出锁语句就不能再次进入锁语句。而不会发生死锁的理由是,同一线程可以多次进入到锁语句中。
我将这段代码拷入VS中运行,发现没有进入死锁,于是想找个权威的理由来解释它,终于在《CLR通过c#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用锁语句。
以上只讨论了单线程的情况,下面的代码给出的两个线程的情况:
<代码>使用系统; 使用System.Threading; 名称空间LockDemo { ,,类项目 ,,{ ,,,,静态void Main (string [] args) ,,,,{ ,,,,,,程序p=新项目(); ,,,,,,MyObj obj=new MyObj (); ,,,,,//第,一个线程 ,,,,,,线程thread1=新线程(僵化); ,,,,,thread1。Name=皌hread1"; ,,,,,//第,一个线程 ,,,,,,线程thread2=新线程(僵化); ,,,,,thread2。Name=皌hread2"; ,,,,,,//启动线程 ,,,,,,thread1.Start (obj); ,,,,,,thread2.Start (obj); ,,,,,,Console.Read (); ,,,,} ,,,,公共空白测试(对象obj) ,,,,{ ,,,,,,锁(这) ,,,,,,{ ,,,,,,,,如果(((MyObj) obj)。价值比;10) ,,,,,,,,{ ,,,,,,,,,,((MyObj) obj) value——; ,,,,,,,,,Console.Write (Thread.CurrentThread。名称+“:”); ,,,,,,,,,,Console.WriteLine (((MyObj) obj) value); ,,,,,,,,,,thread . sleep (10); ,,,,,,,,,,测试(obj); ,,,,,,,,} ,,,,,,,其他的, ,,,,,,,,{ ,,,,,,,,,,Console.WriteLine (Thread.CurrentThread.Name); ,,,,,,,,} ,,,,,,} ,,,,} ,,} ,,///& lt; summary> ,,///将一个值类型封装在一个类中,以便多个线程调用方便 ,,///& lt;/summary> ,公开课MyObj ,,{ ,,,,公共int值; ,,,,公共MyObj () ,,,,{ ,,,,,,//将初始值赋为20 ,,,,,,价值=https://www.yisu.com/zixun/20; } } }代码>
下面是运行结果:
以上是同线程锁语句递归不会死锁的方法是什么的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!