有人可以详细解释一下为什么可以lock
在 C# 中使用任何类型的对象吗?
我了解lock
它的用途和使用方法。我知道它如何扩展到Monitor.Enter
/ Exit
。我正在寻找对实现细节和设计注意事项的解释。
首先:引擎盖下发生了什么?例如:对象实例中是否有额外的位(如 RTTI/vtable 中的)使其工作?还是某种以对象引用为键的查找表?(如果是这样,这如何与 GC 交互?)或者其他什么?为什么我不必创建特定类型的实例来保存锁定数据?
(顺便说一下,在本机代码中做什么Enter
和Exit
映射到什么?)
其次,为什么.NET 设计为没有特定类型的用于取出锁定?(考虑到您通常只是new object()
为了这个目的而做一个 - 并且大多数情况下您锁定“任何旧对象”都是有问题的。)这种设计选择是由实现细节所强迫的吗?还是故意的?而且,如果经过深思熟虑,这是一个不错的选择吗?(我意识到第二部分可能需要推测。)