C# 类型对象指针和同步块索引

按照《CLR via C#》中的说法,每个对象在被创建的时候,会被自动的添加两个信息,一是类型对象指针,二是同步块索引。

C# 类型对象指针和同步块索引_第1张图片

首先,CLR创建类Manager,在内存中分配 类Manager 所占用的空间,当创建Manager的实例M1的时候,M1的类型对象指针就指向Manager;

当用lock来锁定M1的时候,M1的同步块索引就指向一个同步块(这里说明一下同步块,CLR负责创建同步块,可以把它理解为一个数组,数组中的每一个元素就是一个同步块),M1的同步块索引初始为一个负数,表示M1没有同步,当用lock的时候,CLR负责在同步块数组中寻找空闲的同步块,并把M1的同步块索引被设置为一个整数S,S为找到的同步块在同步块数组中的索引,当lock结束之后,M1的同步块索引又被重新设置为负数。

如下图:

C# 类型对象指针和同步块索引_第2张图片

ObjectA的 SyncBlockIndex被设置为0,表示指向同步块数组中的索引为0的元素,

ObjectC的 SyncBlockIndex被设置为2,表示指向同步块数组中的索引为2的元素,

而ObjectB的 SyncBlockIndex被设置为-1,表示未指向任何同步块

你可能感兴趣的:(同步块索引)