为什么不锁定同一物体会导致僵局? [重复]

问题描述 投票:0回答:2
副重复:

c#中的重点锁
如果我写一些这样的代码:

class Program { static void Main(string[] args) { Foo(); Console.ReadLine(); } static void Foo() { lock(_lock) { Console.WriteLine("Foo"); Bar(); } } static void Bar() { lock(_lock) { Console.WriteLine("Bar"); } } private static readonly object _lock = new object(); }

我作为输出:

Foo
Bar

我希望这将僵局,因为Foo获得了锁,然后等待Bar获得锁。 但这不会发生。

锁定机制只会允许这样做,因为代码是在同一线程上执行的?
    

对于同一线程,锁定始终是reentrant

,因此线程可以按照自己的意愿锁定对象。

c# .net locking deadlock
2个回答
96
投票
由于您在这里只有一个线程。

lock


24
投票

Monitor.enter

在通过作为参数的对象上获取监视器。如果另一个线程在对象上执行了ENTER,但尚未执行相应的出口,则当前线程将阻止,直到另一个线程释放对象为止。

对于同一个线程的合法调用是合法的。但是,在对象上等待其他线程将取消阻止之前,必须调用相等数量的退出呼叫。
    

单词:重入锁。
如果线程已经获得了锁,那么如果要再次获得锁定,它将不等待。这是非常需要的,否则它可能会将简单的递归功能变成噩梦!

语句比这更聪明,旨在防止这种情况。 该锁一旦进入内部,该锁就由该线程“拥有”,因此,每当它到达另一个the lock other的语句时,锁定在同一对象上,它就会意识到它已经可以访问该锁。

© www.soinside.com 2019 - 2025. All rights reserved.