它的等级次序对象指针指向本人

近年在看书,看到了对象在内部存款和储蓄器中的存款和储蓄格局。

讲到了对象存款和储蓄在内部存款和储蓄器堆中,分配的空中除了品种对象的成员所需的内部存款和储蓄器量,还应该有额外的分子(类型对象指针、 同步块索引 ),看到这些笔者就有一些不懂了,不通晓类型对象指针是何等,指向的怎么着?

从英特网找也并未有找到,最终往下看,书中微微描述。说下本身的敞亮:

品类对象指针:指向类型对象存款和储蓄的地点,假设有四个档期的顺序Person,它在堆中有一块区域存款和储蓄它当中的字段和成员以及多个附加成员(类型对象指针、 同步块索引 ),类型对象的体系对象指针指向的是System.Type的地点。

因为Person类型在内部存款和储蓄器中相对于System.Type也是用作一个目的存在的,System.Type类型也是三个体系对象,它的品种对象指针指向自家;

实例化叁个Person对象,Person p = new
Person(); p对象在内部存款和储蓄器堆中也分配一块区域存款和储蓄它里面的字段和成员以及八个附加成员(类型对象指针、 同步块索引 ),p的品种对象指针指向Person类型在堆中的地址。

 

同步块索引:先说一下协办块,.NET团队在筹算基本框架时丰硕思虑了线程同步的难题,其结果便是.NET为每三个堆内对象都提供了帮衬线程同步的功效,那便是同步机制的雏形【仿效:http://genwoxuedotnet.blog.51cto.com/1852748/504107

然则对各种堆内对象都分配同步块有一个异常的大的流弊,正是这么增大了内部存款和储蓄器的成本。在相似的系统中,需求联合机制援救的目的恐怕只占少数,这样对于好些个对象的话,贰个同台块的内部存款和储蓄器消耗就全盘被荒凉了。鉴于那一点,.NET框架选拔了一种折中的办法,正是事实上只为各种堆内对象分配一个共同索引,该索引中只保留八个标记数组内索引的卡尺头。.NET在加载时会新建二个一起块数组,当某些对象需求被同台时,.NET会为其分配多个三头块,而且把该联合块在共同块数组中的索引出席该对象的同台块索引中。

同步块机制包罗如下的几点:
·
在.NET被加载时开首化同步块数组。
·
每三个被分配在堆上的靶子都会蕴藏三个附加的字段,个中四个仓库储存类型指针,而除此以外四个就算一道块索引,开端时被赋值为-1。
·
当一个线程试图利用该指标步向同步时,会检查该目的的一块索引。若是索引为负数,则会在一起块数组中搜寻抑或新建二个一块块,而且把共同块的索引值写入该对象的同步索引中。借使该指标的同步索引不为负值,则找到该指标的协同块况兼检查是或不是有其余线程在行使该联合块,假诺有则跻身等待情形,若无则表明使用该同步块。

同步块是指.NET维护的联合块数组中的有些成分

 

相关文章