`lock`(Monitor)如何在.NET中运行?

atl*_*ste 6 .net c# multithreading locking monitor

我最近想知道.NET中内部如何lock(或更具体Monitor:)在锁定的对象方面工作.具体来说,我想知道开销是什么,如果有"全局"(进程)锁使用,如果可能创建更多的全局锁(如果是这种情况)(对于监视器组)以及对象发生了什么被传递给锁(它们似乎不会引入额外的内存开销).

澄清一下我没有问的问题:我不是在问这个监视器是什么(我以前在大学做了一个).我也没有问如何使用lock,监控,他们如何编译到try/finally等; 我非常清楚这一点(还有其他与之相关的问题).这是关于内部运作Monitor.EnterMonitor.Exit.

例如,考虑由十个线程执行的代码:

for (int i=0; i<1000; ++i) 
{
    lock (myArray[i])
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 锁定一千个对象而不是一个对象是不是很糟糕?在性能/内存压力方面有什么影响?
  • 底层监视器创建一个等待队列.是否可以有多个等待队列,我将如何创建它?

And*_*bel 5

Monitor.Enter不是一个普通的.NET方法(不能用ILSpy或类似方法反编译).该方法由CLR内部实现,严格来说,.NET没有一个答案,因为不同的运行时可能有不同的实现.

.NET中的所有对象都有一个对象头,其中包含指向对象类型的指针,但也包含一个SyncBlock索引SyncTableEntry.通常该索引为零/未使用,但是当您锁定对象时,它将包含一个索引SyncTableEntry,然后该索引包含对实际锁定对象的引用.

因此锁定数千个对象确实会产生很多锁,这是一个开销.

我发现的信息在这篇MSDN文章中:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx