gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:24:36 25 4
gpt4 key购买 nike

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

我了解lock 的用途以及如何使用它。我知道它如何扩展到 Monitor.Enter/Exit。我正在寻找对实现细节和设计注意事项的解释。

首先:幕后发生了什么?例如:对象实例中是否有额外的位(如 RTTI/vtable)使其工作?或者某种以对象引用为关键字的查找表? (如果是这样,这如何与 GC 交互?)或者其他什么?为什么我不必创建特定类型的实例来保存任何锁数据?

(顺便说一句,EnterExit 在 native 代码中映射到什么?)

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

最佳答案

可以在所有非struct 类型上lock。在堆上每个引用类型的布局中,都有用于管理锁的特殊字段(同步块(synchronized block))。 How CLR Creates Runtime Object 中详细介绍了布局.文章摘录如下:

The OBJECTREF does not point to the beginning of the Object Instance but at a DWORD offset (4 bytes). The DWORD is called Object Header and holds an index (a 1-based syncblk number) into a SyncTableEntry table.

堆上的对象布局:

sync block index 
pointer to type
fields...

推测部分:我相信最初的指导是锁定任何方便的东西,但由于很容易让外部代码使您的方法陷入僵局,因此相对较快地更改为具有特殊的“用于锁定的私有(private)对象”。我认为 Framework 中甚至有一些类无法锁定公开可见的对象......

关于c# - 为什么我可以锁定 C# 中的任何对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com