首页 文章

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

提问于
浏览
4

我最近一直想知道 lock (或更具体的: Monitor )在.NET内部如何处理被锁定的对象 . 具体来说,如果's the case (for groups of monitors) and what happens to the objects that are passed to lock (they don' t似乎引入了额外的内存开销,那么我可以创建更多的全局锁 .

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

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

for (int i=0; i<1000; ++i) 
{
    lock (myArray[i])
    {
        // ...
    }
}
  • 锁定一千个对象而不是一个对象是不是很糟糕?在性能/内存压力方面有什么影响?

  • 基础监视器创建等待队列 . 是否可以有多个等待队列,我将如何创建它?

2 回答

  • 1

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

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

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

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

  • 5

    Here是阅读有关显示器,内存屏障等的好地方 .

    EDIT

    以后页面中的屏幕截图在以后的情况下会丢失:
    enter image description here

相关问题