同步块和同步块索引 - zLulus/My_Note GitHub Wiki
同步块是.NET中解决对象同步问题的基本机制
.NET团队在设计基本框架时充分考虑了线程同步的问题,其结果就是.NET为每一个堆内对象都提供了支持线程同步的功能
但是对每个堆内对象都分配同步块有一个较大的弊端,就是这样增大了内存的消耗
->实际只为每个堆内对象分配一个同步索引
同步块是指.NET维护的同步块数组中的某个元素,负责提供线程同步的操作
同步块索引是每个堆内对象都会分配的一个字段
同步块机制包含如下的几点:
· 在.NET被加载时初始化同步块数组
· 每一个被分配在堆上的对象都会包含两个额外的字段,其中一个存储类型指针,而另外一个就是同步块索引,初始时被赋值为-1
· 当一个线程试图使用该对象进入同步时,会检查该对象的同步索引。如果索引为负数,则会在同步块数组中寻找或者新建一个同步块,并且把同步块的索引值写入该对象的同步索引中。如果该对象的同步索引不为负值,则找到该对象的同步块并且检查是否有其他线程在使用该同步块,如果有则进入等待状态,如果没有则申明使用该同步块
同步块索引是用来找它的基类用的,对象指针是用来找它本身的
同步块索引比较多地方会用到:判断相等性、锁对象、gethashcode、类和结构体
相关链接:
http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html