为什么这段代码没有死锁?

时间:2011-02-18 19:54:29

标签: c# .net multithreading

Log方法块应该阻止吗?

namespace Sandbox {
class Program {
    static void Main(string[] args) {
        var log = new Logger();
        lock (log) {
            log.Log("Hello World!");
        }
    }
}

public class Logger {
    public void Log(string message) {
        lock (this) {
            Console.WriteLine(message);
        }
    }
}

}

3 个答案:

答案 0 :(得分:37)

相同的线程两次获取相同的锁。这是有效的,因为.NET支持所谓的递归锁(又名reentrant mutexes)。

答案 1 :(得分:4)

如果一个线程锁定了一个资源,那么该线程就被允许进入,即使它已经拥有了一个锁。这个

也是如此
Object obj = new Object();

lock(obj) {
    lock(obj) {
        foo();
    }
}

如果因为同一个帖子而无法通过,会锁定。

答案 2 :(得分:3)

简单 - 您在一个线程中运行。