CLR 同步块地址

CLR Sync Block Address

当我这样做时:

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. 蓝色矩形是
  3. 类型的4字节地址
  4. 红色矩形为4字节整数,即3;

问:同步块space在哪里,如何找到? “12”代表什么?

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

你的情况是简单的情况,只调用了 lock 并且打开了 none 专用位。所以你看到锁的拥有者,0x12=18就是拥有锁的线程的Thread.ManagedThreadId。当您需要解决死锁问题时,这会派上用场。

当您右键单击 window 和 select“4 字节整数”时,您可以使调试器的显示更容易理解。蓝色矩形是对象的方法 table 指针(又名 "type handle")。它指示对象的类型,Object.GetType() 使用它。红色矩形是对象开始存储其字段的位置。由于你的只有exp字段,而且类型是Int32,所以可以看到3回。