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