7

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

编码 :

    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 将被释放( locker 范围) - 但 foo 的所有调用 ++i 的 arg 都可以进入 locker 块。

4

4 回答 4

13

这里使用的锁是可重入的。它会阻止另一个线程进入监视器,但持有锁的线程不会被阻塞。

于 2012-04-11T03:42:34.907 回答
8

lock 关键字只是Monitor.EnterandMonitor.Exit方法的语法糖。如文档中所示Monitor

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

lock(object)从同一个线程多次调用除了增加锁计数之外没有任何作用。

于 2012-04-11T03:42:55.653 回答
1

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

于 2012-04-11T03:42:53.767 回答
1

当您在线程 t1 上进行递归调用时,它并没有脱离单独的线程。递归调用是在同一个线程 t1 上进行的。

由于 t1 已经持有锁,它不必等待锁。

于 2012-04-11T04:04:40.023 回答