CLR同步块地址

时间:2015-06-07 06:37:03

标签: c# heap 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):

enter image description here

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

  1. 绿色矩形是同步块,为12
  2. 蓝色矩形是
  3. 类型的4字节地址
  4. 红色矩形为4字节整数,为3;
  5. 问题:同步块的空间在哪里,我该如何找到它? “12”代表什么?

1 个答案:

答案 0 :(得分:14)

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

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

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