当前位置: 代码迷 >> 多核软件开发 >> 求解答一道线程同步的题的疑问? 解决方案
  详细解决方案

求解答一道线程同步的题的疑问? 解决方案

热度:1008   发布时间:2013-02-26 00:00:00.0
求解答一道线程同步的题的疑问? - .NET技术 / C#
根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock(this)
{
if (i>10)
{
i-–;
test(i);
}
}
}
网上一致的答案是:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)


对于这个题目的答案有些迷惑了,,难道对于同步锁理解完全错了···
这个 何来的死锁???递归调用 多是同一个线程吧,既然是同一个线程,怎么会死锁呢??? 要有错误隐患也是无限递归的问题,而且这里也不会造成无限递归吧。

同步锁对象不是lock(object o) 括号中的对象o吗,这个跟test(int i) 参数 i 有啥半毛钱的关系?

求大侠 当头一棒!!!

------解决方案--------------------------------------------------------
不会发生死锁是因为 同一个thread可以递归多次进入同步块

要验证对不对,自己写个程序不就明白了
------解决方案--------------------------------------------------------
我且不管所谓“会不会死锁”这个结论如何,大概你审题有问题。但凡人家说到死锁,是说启动几十个线程来调用test方法,或者是调用test方法时同时还有其它线程访问当初传递给不同线程的test方法的参数i,而并不是说递归就会死锁。
------解决方案--------------------------------------------------------
在这段代码里,按值传递,每调用一次函数相当于同一个线程对一个新的锁加了锁,随着递归的深入,会有更多的新锁

但是如果按引用传递,那就相当于这个线程在拿到锁以后又要拿这个锁,自然死锁了

不过如果这个锁是个递归锁,那就无论如何不会死锁了。。

------解决方案--------------------------------------------------------
《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句

这个不会死锁,网上的答案解释有点不解

楼主可以测试一下把i改成一个object
  相关解决方案