class Class1
{
private static object consoleGate = new Object();
private static void Trace(string msg)
{
lock (consoleGate)
{
Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore",
DateTime.Now.ToString("HH:mm:ss.ffff"), msg);
}
}
private static void ProcessWorkItems()
{
lock (consoleGate)
{
for (int i = 0; i < 5; i++)
{
Trace("Processing " + i);
Thread.Sleep(250);
}
}
Console.WriteLine("Terminado.");
}
static void Main()
{
ProcessWorkItems(); Console.ReadLine();
}
}
输出:
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Terminated
为什么这段代码有效? ProcessWorkItems静态方法锁ConsoleGate对象和Trace做了同样的事情。我以为这个物体只能被锁定一次。 ¿有些解释?
答案 0 :(得分:4)
C#中的锁是可重入的 - 单个线程可以多次获取相同的锁而不会阻塞。正常情况下,这里只有一个线程没有问题 - 锁用于跨多个线程同步对资源的访问。
来自lock
上的MSDN documentation:
lock关键字确保一个线程不会输入关键字 代码部分,而另一个线程位于关键部分。如果 另一个帖子尝试输入锁定的代码,它会等待,阻止, 直到对象被释放。
有关可重入锁定的更多信息,请参阅此SO线程:"What is the Re-entrant lock and concept in general?"
答案 1 :(得分:1)
此处显示的所有代码都在同一个线程上运行。这就是为什么它就像你没有使用“锁定”
那样运行