微软在设计基本框架时充分考虑了线程同步的问题,其结果就是CLR为每一个堆内对象都提供了支持线程同步的功能,这是同步机制的雏形。但是对每个堆内对象都分配同步块有一个较大的弊端,就是这样增大了内存的消耗。在一般的系统中,需要同步机制支持的对象可能只占少数,这样对于大多数对象来说,一个同步块的内存消耗就完全被浪费了。

  鉴于这一点,CLR采用了一种折中的办法,就是实际只为每个堆内对象分配一个同步索引,该索引中只保存一个表明数组内索引的整数。CLR在加载时会新建一个同步块数组,当某个对象需要被同步时,CLR会为其分配一个同步块,并且把该同步块在同步块数组中的索引加入该对象的同步块索引中。图7.5展示了这一机制的实现。
同步块机制包含如下的几点:

  · 在CLR被加载时初始化同步块数组。

  · 每一个被分配在堆上的对象都会包含两个额外的字段,其中一个存储类型指针,而另外一个就是同步块索引,初始时被赋值为-1。

  · 当一个线程试图使用该对象进入同步时,会检查该对象的同步索引。如果索引为负数,则会在同步块数组中寻找或者新建一个同步块,并且把同步块的索引值写入该对象的同步索引中。如果该对象的同步索引不为负值,则找到该对象的同步块并且检查是否有其他线程在使用该同步块,如果有则进入等待状态,如果没有则申明使用该同步块。

  · 当一个对象退出同步时,该对象的同步索引被赋值为-1,并且对应的同步块数组内的同步块被视为不再使用。

进入同步和退出同步,指的是调用System.Threading.Monitor的Enter方法和Exit方法,现在一般使用lock关键字。

注意:负责为对象分配同步块并且赋值同步块索引的线程本身是线程安全的。

结论:同步块是指CLR维护的同步块数组中的某个元素,负责提供线程同步的操作,当某个线程拥有了某个同步块时,其他线程就在试图访问该同步块时进入等待状态。同步索引是每个堆内对象都会分配的一个字段。

posted @ 2021-03-14 10:45 Sandglass 阅读(426) 评论(0) 推荐(1) 编辑
摘要: 元组是不可变的列表! 阅读全文
posted @ 2020-12-11 08:35 Sandglass 阅读(100) 评论(0) 推荐(0) 编辑
摘要: 在查找字典时,python会把key值用hash(key)计算出来, 然后就可以很快的在内存中找到对应的字典值, 即使这个字典的元素都不是连续的。 阅读全文
posted @ 2020-12-07 15:31 Sandglass 阅读(101) 评论(0) 推荐(0) 编辑
摘要: Python随笔之列表List 阅读全文
posted @ 2020-11-27 22:18 Sandglass 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 第一次搞这么多图 阅读全文
posted @ 2020-11-25 22:40 Sandglass 阅读(169) 评论(0) 推荐(0) 编辑
摘要: Statistics 在PL/SQL Developer中是自带的(不需要加plustrace角色),但如果没有赋予访问动态性能表的权限是没有数据的,所以,想看统计信息,就先GRANT SELECT_CATALOG_ROLE TO username; 如果想增加统计列,在Preferences... 阅读全文
posted @ 2020-08-06 11:47 Sandglass 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpModule”。 原因: 这是因为先安装了 .NET Framework 4,随后启用了 .NET Framework 3.5 WCF HTTP 激活,则会发生此错误。 阅读全文
posted @ 2015-03-06 09:44 Sandglass 阅读(8579) 评论(0) 推荐(0) 编辑
摘要: 最近在做项目的时候需要操作ftp进行文件的上传下载,但在调用using (var response = (FtpWebResponse)FtpWebRequest.GetResponse())的时候总是出现"远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)"的异常。在网上也没有找到好的解决方案,于是自己研究了下给解决了,分享给大家,希望对大家能有所帮助。 阅读全文
posted @ 2014-03-20 09:44 Sandglass 阅读(47468) 评论(3) 推荐(1) 编辑
摘要: 关于app.config不能即时保存读取的解决方案 阅读全文
posted @ 2014-03-04 11:52 Sandglass 阅读(6086) 评论(2) 推荐(1) 编辑
摘要: 最近试了试castle,NND,老是报“Could not find the dialect in the configuration”,明明配的没问题,上网搜索所有教程都是这么配的。后来在一国外的网站解决NHibernate的问题的帖子,看的一哥们说把hibernate去了试试,当时也没试(关键是那帖子说这个办法没解决问题)。囧rz,今天试了试,居然解决问题了。估计可能和castle的版本有关系(顺便说一下castle网站的源码的例子也是不对的,NND)。 阅读全文
posted @ 2013-08-12 15:22 Sandglass 阅读(1237) 评论(2) 推荐(0) 编辑
摘要: Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件。通常我们在写程序时,或多或少都会写上批注,但是对于其它人而言,要直接探索程序里的批注,与打捞铁达尼号同样的辛苦。大部分有用的批注都是属于针对函式,类别等等的说明。所以,如果能依据程序本身的结构,将批注经过处理重新整理成为一个纯粹的参考手册,对于后面利用您的程序代码的人而言将会减少许多的负担。不过,反过来说,整理文件的工作对于您来说,就是沉重的负担。 Doxygen 就是在您写批注时,稍微按照一些它所制订的规则。接着,他就可以帮您产生出漂亮的文档了。 因此,Doxygen 的使用可分为两大部分。首先是特定格式的批注撰写,第二便是利用Doxygen的工具来产生文档。 阅读全文
posted @ 2013-07-02 11:41 Sandglass 阅读(4667) 评论(0) 推荐(1) 编辑
摘要: 当需要将一个复杂的对象或创建的比较花费时间的对象表示成一个简单对象时,可以使用代理模式。如果创建一个对象比较浪费时间或浪费计算机资源,Proxy允许将创建过程推迟到需要该实际对象的时候。Proxy对象通常具有和它所代表的对象一样的方法,一旦对象被调入,就把调用方法从Proxy传递给实际对象。 阅读全文
posted @ 2013-06-05 12:28 Sandglass 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 本篇中我们学习如何使用组合模式,通常在程序员开发的系统中,组件即可以是单个的对象,也可以是对象的集合。组合模式包括了这两种情况,组合就是对象的集合,其中的每个对象即可以是一个组合,也可以是简单的对象。在树的术语中,对象可以是带有其他分支的节点,也可以是叶子。 阅读全文
posted @ 2013-06-04 15:04 Sandglass 阅读(1013) 评论(2) 推荐(0) 编辑
摘要: 本篇中我们学习如何使用生成器模式从部件构建对象,假设我们不但需要一个用于计算的算法,还需要一个根据数据的不同而完全不同的用户界面,典型的例子就是E-mail地址薄,在地址薄中,即有个人信息也有组的信息,而用户希望能根据信息的不同,改变地址薄的显示, 这样在用户屏幕中能显示姓名、公司、E-mail地址和电话号码。另一方面,如果显示一个组的地址页,希望能看到组名、组的职能、成员表及他们的E-mail地址。单击一个人的时候得到一种显示方式,单击一个组的时候得到另一种显示方式。 阅读全文
posted @ 2013-05-30 12:08 Sandglass 阅读(1339) 评论(0) 推荐(1) 编辑
摘要: Memcached 协议中英文对照 阅读全文
posted @ 2012-08-06 13:40 Sandglass 阅读(561) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示