我写了简单的代码(附件),我不明白为什么某些块上的锁没有锁定范围。
代码:
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块。
答案 0 :(得分:12)
此处使用的锁是可重入的。它将阻止另一个线程进入监视器,但是不会阻止持有锁的线程。
答案 1 :(得分:7)
lock关键字只是围绕Monitor.Enter
和Monitor.Exit
方法的语法糖。如Monitor
lock(object)
中所示:
同一个线程在没有阻塞的情况下多次调用Enter是合法的;
多次从同一个线程调用{{1}}除了增加锁定次数外无效。
答案 2 :(得分:1)
如果您在同一个线程上,则锁定不适用。见http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
答案 3 :(得分:1)
当你在线程说t1进行递归调用时,它不会旋转一个单独的线程。递归调用是在同一个线程t1上进行的。
由于t1已经持有锁定,因此无需等待锁定。