gpt4 book ai didi

c# - CLR 同步块(synchronized block)地址

转载 作者:太空狗 更新时间:2023-10-29 21:01:25 25 4
gpt4 key购买 nike

当我这样做时:

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. 绿色矩形为同步块(synchronized block),为12
  2. 蓝色矩形是4字节类型的地址
  3. 红色矩形框为4字节整数,即3;

问题:sync blocks的空间在哪里,如何找到?“12”代表什么?

最佳答案

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

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

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

关于c# - CLR 同步块(synchronized block)地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com