void test(int i)
        {
            lock (this)
            {
                if (i > 10)
                {
                    i--; 
                    test(i);
                }
            }
        }
面试题:当i>10时,是否会发生死锁,为什么?
假定test(15)
单步发现 当i--到10时,执行完了lock块以后,程序又会跳回去执行迭代的test(i),这时候i又会自加,直到14后,完成整个调用。
不太明白为什么会这样,lock应该只能锁引用类型,不能锁值类型的,否则会发生死锁,是这样吗?
(最好的做法是声明一个private的实例,然后锁它,这个我知道)

解决方案 »

  1.   

    http://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx
    刚在msdn上看的。对于lock我没用过。感觉挺有意思的。
      

  2.   

    lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
    http://topic.csdn.net/u/20100707/21/4397f902-a578-4ad6-a28c-523dd07a32ad.html
      

  3.   

    这个例子里不会死锁,lock语句实际上是调用 Monitor 的 Enter 和 Exit,同一线程在不阻止的情况下多次调用 Enter 是合法的,如果锁定值类型,那么这个值会装箱。我想楼主的函数只是实验性质的。
      

  4.   

    谢谢两位
    lock关键看锁的是什么对象,this即当前对象的实例,如果有并发线程,则在另外一个线程中无法访问该实例(直到解锁),或者重新声明一个新实例,所以一般都应该锁一个private的实例,这样可以避开不应该出现的死锁假定test(15)
    单步发现 当i--到10时,执行完了lock块以后,程序又会跳回去执行迭代的test(i),这时候i又会自加,直到14后
    还是不太明白为什么lock块执行完后,迭代的test(i)会自加,直到14后完成整个调用..
      

  5.   

    对test(15)的调用中,内部的递归test(xx)与test(15)内的i几乎没有关系.所以最后递归返回时i仍然是14.也就是说,当i为15时,执行了一下i--后,下面的test(14)以及test(14)内部的i与test(15)时的i根本没有直接关系另外,值类型lock时,能通过编译吗?VS2010ENU版的通不过编译