我最近想知道lock
(或更具体的:Monitor
)在.NET内部如何处理锁定的对象。具体来说,我想知道开销是什么,如果有“全局”(进程)锁使用,如果可能创建更多的全局锁(如果是这种情况)(对于监视器组)以及对象发生了什么被传递给锁(它们似乎没有引入额外的内存开销)。
澄清我没有问的问题:我不是在问这里Monitor是什么(我前一段时间在大学做过一个)。我也没有问如何使用lock
,Monitor,如何编译到try / finally等;我非常清楚这一点(还有其他与之相关的问题)。这是关于Monitor.Enter
和Monitor.Exit
的内部工作。
例如,考虑这个代码由十个线程执行:
for (int i=0; i<1000; ++i)
{
lock (myArray[i])
{
// ...
}
}
答案 0 :(得分:5)
Monitor.Enter
不是普通的.NET方法(无法使用ILSpy或类似方法进行反编译)。该方法由CLR内部实现,严格来说,.NET没有一个答案,因为不同的运行时可能有不同的实现。
.NET中的所有对象都有一个对象头,其中包含指向对象类型的指针,还包含SyncBlock
的{{1}}索引。通常该索引为零/未使用,但是当您锁定对象时,它将包含SyncTableEntry
的索引,该索引随后包含对实际锁定对象的引用。
因此锁定数千个对象确实会产生很多锁,这是一个开销。
我发现的信息在此MSDN文章中:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx
答案 1 :(得分:1)