我有一个问题 Monitor.Enter 是如何工作的。我研究了.net框架源代码,它只显示了这一点:
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnter(Object obj, ref bool lockTaken);
我猜Monitor.Enter的实现是依赖于平台的,所以我浏览了Mono源代码,然后放弃了:(
是的,为每个System.Object实例分配一个关键部分可能会解决问题,但是,我不认为实际的Monitor.Lock是这样写的,因为为每个System.Object创建一个关键部分将花费无限的成本。 (Win32 不允许进程中存在数十亿个临界区对象!)
有人知道 Monitor.Enter 是如何工作的吗?请回复。提前致谢。
.NET 中的每个对象都有两个额外的(隐藏的——你看不到它们)开销成员:
- “类型对象指针”。这只是一个参考
Type
对象的实例。事实上,您可以通过调用“访问”它GetType()
.
- “同步块索引”。这是一个本机 WORD 大小的整数类型,它是 CLR 内部“同步块”数组的索引。
这就是它跟踪哪些对象被锁定的方式。
同步块结构包含一个可以标记为锁定的字段。基本上,当您锁定一个对象时,该字段就会打开。当锁被释放时,它会被关闭(基本上 - 我没有足够长的时间来研究 SSCLI 来深入研究这种操作是如何工作的 - 我相信它是基于EnterCriticalSection
尽管..)。
The MethodImplOptions.InternalCall
您传递给上述属性的参数意味着该方法的实际实现驻留在 CLR 中。这就是您无法进一步浏览代码的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)