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):
我意识到下面提到的几件事情:
- 绿色矩形是同步块,即12
- 蓝色矩形是4字节类型的地址
- 红色矩形是4字节整数,即3;
问题:同步块的空间在哪里,我该如何找到它? “12”代表什么?
同步块有多个用途。 它可以存储Object.GetHashCode()的值,以便在再次调用GetHashCode()时,对象始终返回相同的哈希代码。 它可以存储lock语句的所有者线程的ID。 它有几个专用位,比如指示对象的终结器已经运行。 并且它可以存储分配的同步块的句柄,当一个线程都调用GetHashCode 并使用了锁并且信息不再适合同步块时,这是必需的。 它经过了微观优化。
您的情况很简单,只调用了锁 ,并且没有打开任何专用位。 所以你看到锁的所有者,0x12 = 18是拥有锁的线程的Thread.ManagedThreadId。 当你需要解决僵局时,这可以很方便。
右键单击窗口并选择“4字节整数”时,可以使调试器显示更容易解释。 蓝色矩形是对象的方法表指针(也称为“类型句柄”)。 它指示对象的类型,Object.GetType()使用它。 红色矩形是对象开始存储其字段的位置。 由于你的只有exp
字段,它的类型是Int32,你可以看到3。