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):
我意识到下面提到的几件事:
- 绿色矩形为同步块,即12
- 蓝色矩形是
类型的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回。
当我这样做时:
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;
问:同步块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回。