CLR同步块地址

当我做:

public class Employee { public int exp; } class Program { static void Main(string[] args) { Employee o1 = new Employee(); o1.exp = 3; lock (o1) { //I am here } } } 

并获取o1的内存(地址为0x022cf940):

在此处输入图像描述

我意识到下面提到的几件事情:

  1. 绿色矩形是同步块,即12
  2. 蓝色矩形是4字节类型的地址
  3. 红色矩形是4字节整数,即3;

问题:同步块的空间在哪里,我该如何找到它? “12”代表什么?

同步块有多个用途。 它可以存储Object.GetHashCode()的值,以便在再次调用GetHashCode()时,对象始终返回相同的哈希代码。 它可以存储lock语句的所有者线程的ID。 它有几个专用位,比如指示对象的终结器已经运行。 并且它可以存储分配的同步块的句柄,当一个线程都调用GetHashCode 使用了锁并且信息不再适合同步块时,这是必需的。 它经过了微观优化。

您的情况很简单,只调用了 ,并且没有打开任何专用位。 所以你看到锁的所有者,0x12 = 18是拥有锁的线程的Thread.ManagedThreadId。 当你需要解决僵局时,这可以很方便。

右键单击窗口并选择“4字节整数”时,可以使调试器显示更容易解释。 蓝色矩形是对象的方法表指针(也称为“类型句柄”)。 它指示对象的类型,Object.GetType()使用它。 红色矩形是对象开始存储其字段的位置。 由于你的只有exp字段,它的类型是Int32,你可以看到3。