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

时间:2014-01-10 09:00:40

标签: c# .net multithreading locking monitor

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

澄清我没有问的问题:我不是在问这里Monitor是什么(我前一段时间在大学做过一个)。我也没有问如何使用lock,Monitor,如何编译到try / finally等;我非常清楚这一点(还有其他与之相关的问题)。这是关于Monitor.EnterMonitor.Exit内部工作

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

Here是阅读监视器,内存障碍等的好地方。

修改

以后页面中的屏幕截图,以防将来发生故障: enter image description here