我最近一直想知道 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.Enter
和 Monitor.Exit
的内部运作方式 .
例如,考虑由十个线程执行的代码:
for (int i=0; i<1000; ++i)
{
lock (myArray[i])
{
// ...
}
}
-
锁定一千个对象而不是一个对象是不是很糟糕?在性能/内存压力方面有什么影响?
-
基础监视器创建等待队列 . 是否可以有多个等待队列,我将如何创建它?
2 回答
Monitor.Enter
不是正常的.NET方法(无法使用ILSpy或类似方法进行反编译) . 该方法由CLR内部实现,严格来说,.NET没有一个答案,因为不同的运行时可能有不同的实现 ..NET中的所有对象都有一个对象头,其中包含指向对象类型的指针,但也包含指向
SyncTableEntry
的SyncBlock
索引 . 通常该索引为零/未使用,但是当您锁定对象时,它将包含SyncTableEntry
的索引,然后该索引包含对实际锁定对象的引用 .因此锁定数千个对象确实会产生很多锁,这是一个开销 .
我发现的信息在这篇MSDN文章中:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx
Here是阅读有关显示器,内存屏障等的好地方 .
EDIT
以后页面中的屏幕截图在以后的情况下会丢失: