繁体   English   中英

为什么我可以锁定C#中的任何对象类型?

[英]Why can I lock on any object type in C#?

有人可以详细解释为什么可以在C#中lock任何类型的对象?

我理解lock是什么以及如何使用它。 我知道它如何扩展到Monitor.Enter / Exit 我正在寻找实施细节和设计考虑因素的解释。

首先:引擎盖下发生了什么? 例如:对象实例中是否有额外的位(就像RTTI / vtable那样)是否有效? 或者在对象引用上键入某种查找表? (如果是这样,它如何与GC交互?)或其他什么? 为什么我不必创建一个特定类型的实例来保存锁定数据?

(顺便说一下, EnterExit在本机代码中映射到什么?)

其次, 为什么 .NET设计为没有特定类型来取出锁定? (鉴于您通常只为此目的创建一个new object() - 大多数情况下您锁定“任何旧对象”都是有问题的。)这个设计选择是否被实现细节所迫? 还是故意的? 而且,如果是故意的,这是一个不错的选择吗? (我意识到第二部分可能需要推测。)

可以lock所有非struct类型。 在堆上的每个引用类型的布局中,存在用于管理锁的特殊字段(同步块)。 CLR如何创建运行时对象详细介绍了布局。 文章摘录如下:

OBJECTREF不指向对象实例的开头,而是指向DWORD偏移量(4个字节)。 DWORD称为Object Header,它将索引(基于1的syncblk编号)保存到SyncTableEntry表中。

堆上的对象布局:

sync block index 
pointer to type
fields...

推测部分:我认为最初的指导是锁定任何方便的东西,但由于容易获得外部代码使你的方法陷入僵局,因此它被相对快速地改为拥有特殊的“私有锁定对象”。 我认为甚至框架中的类都被锁定在公开可见的对象上...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM