为什么此代码中的锁不起作用?

时间:2012-04-11 03:37:59

标签: c#

我写了简单的代码(附件),我不明白为什么某些块上的锁没有锁定范围。

代码:

    object locker = new object();
    private void foo(int i)
    {
        Console.WriteLine( string.Format( "i is {0}", i ) );
        lock( locker )
        {
            while( true )
            {
                Console.WriteLine( string.Format( "i in while loop is {0}", i ) ) ;
                foo( ++i );
            }
        }
    }

我希望在while循环中调用foo方法将一直等到锁定器将被释放(locker scope) - 但是带有arg ++的foo的所有调用都可以进入locker块。

4 个答案:

答案 0 :(得分:12)

此处使用的锁是可重入的。它将阻止另一个线程进入监视器,但是不会阻止持有锁的线程。

答案 1 :(得分:7)

lock关键字只是围绕Monitor.EnterMonitor.Exit方法的语法糖。如Monitor lock(object)中所示:

  

同一个线程在没有阻塞的情况下多次调用Enter是合法的;

多次从同一个线程调用{{1}}除了增加锁定次数外无效。

答案 2 :(得分:1)

如果您在同一个线程上,则锁定不适用。见http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

答案 3 :(得分:1)

当你在线程说t1进行递归调用时,它不会旋转一个单独的线程。递归调用是在同一个线程t1上进行的。

由于t1已经持有锁定,因此无需等待锁定。