根据线程安全的相关知识,分析以下代码,当调用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 有啥半毛钱的关系?求大侠  当头一棒!!!

解决方案 »

  1.   

    不会发生死锁是因为 同一个thread可以递归多次进入同步块要验证对不对,自己写个程序不就明白了
      

  2.   

    我且不管所谓“会不会死锁”这个结论如何,大概你审题有问题。但凡人家说到死锁,是说启动几十个线程来调用test方法,或者是调用test方法时同时还有其它线程访问当初传递给不同线程的test方法的参数i,而并不是说递归就会死锁。
      

  3.   

    这里  多线程调用test(int i),要有死锁也是 又其他方法有LOCK(this) 的锁,才可能发生死锁吧??至于其他线程方法 访问参数i  这会存在死锁? 顶多是有个竞态的问题存在吧??这里LOCK的是 this  而不是参数i, 我认为只有LOCK 是参数i并且i未object 才会出现死锁
      

  4.   

    《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句这个不会死锁,网上的答案解释有点不解楼主可以测试一下把i改成一个object