public void test1(int i)
        {            lock (this)
            {
                if (i > 10)
                {
                    i--;
                    test1(i);
                }
            }
        } 
         
        void main()
        {
           test(22)
         }这个是不会死锁的
为什么?当test(22)里面的时候不是将this锁住了嘛,test(21)的时候不是要等待释放吗,这样岂不是会死锁吗?

解决方案 »

  1.   

    我在vs里面试了下 好像不会(vs2008)
      

  2.   

    内部的 test1(i);  相当于 while 中的 break所以 到10就退出来了
      

  3.   

            public class A
            {
                Object o = new object();
                public void test1(int i)
                {                lock (o)
                    {
                        if (i > 10)
                        {
                            i--;
                            test1(i);
                        }
                    }
                }
            }
                A a = new A();
                a.test1(22);
    我也试了,没有死锁。
      

  4.   


    另外 lock 也起作用 锁过的,再打开,最后能退出来
      

  5.   

    什么意思?没明白
    关键是我感觉 它调用test1(21)的时候就会死锁了呀 (因为在调用test1(22)的时候已经锁住了this,test1(21)的时候是要等待释放才能继续啊)
      

  6.   

    没明白  为什么相当于,我主要想问明白那个lock锁的问题
      

  7.   

    学习一下
    lock了有什么用处,在什么情况下用?
      

  8.   

    这是个有条件的递归调用,一旦条件不成立,注定不是死循环.
    lock锁住了 >10 的情况,接下来就是开锁的问题了
    换个测试例子:test(12),断点跟踪一下就明白了。
      

  9.   

    我断点跟踪了
    知道是什么顺序 ,但是我奇怪的就是:
    比如test(12)
    进来的时候是锁住了this,对吧?然后往下走,到了
                       if (i > 10)
                        {
                            i--;
                            test(i);
                        }
    这个时候i=11,所以又要调用函数,到test(11)(注意这个时候test(12)的lock锁还没有释放掉),test(11)的时候又要lock(this),但此时锁还没释放,不是要等待嘛?为什么没有等待?
      

  10.   

    提供给 lock 关键字的参数必须为基于引用类型的对象,避免多线程对共享资源进行交叉请求
      

  11.   

    不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
      

  12.   

    问下  我上面的代码中的lock(this)这里的this是引用类型,是类吧?