猿问

C#中的重入锁

以下代码是否会在.NET上使用C#导致死锁?


 class MyClass

 {

    private object lockObj = new object();


    public void Foo()

    {

        lock(lockObj)

        { 

             Bar();

        }

    }


    public void Bar()

    {

        lock(lockObj)

        { 

          // Do something 

        }

    }       

 }


慕尼黑5688855
浏览 901回答 3
3回答

红糖糍粑

如果线程已经持有锁,那么它将不会自身阻塞。.Net框架确保了这一点。您只需要确保两个线程都不会尝试通过任何代码路径乱序获取相同的两个锁。同一线程可以多次获取相同的锁,但是必须确保释放锁的次数与获取锁的次数相同。当然,只要您使用“ lock”关键字来完成此操作,它就会自动发生。

摇曳的蔷薇

不,此代码不会有死锁。如果您确实要创建死锁,则最简单的死锁至少需要2个资源。考虑狗和骨头的情况。一只狗对一根骨头有完全的控制权,所以其他任何一只狗都必须等待。2.最少需要2条带有2条骨头的狗才能分别在锁定骨头和寻找其他骨头时产生死锁。..依此类推,n条狗和多条骨头,造成更复杂的死锁。
随时随地看视频慕课网APP
我要回答