为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

栏目: IT技术 · 发布时间: 6年前

内容简介:非泛型版本的虽然泛型版本的先上结论:

非泛型版本的 ICollection 中有 IsSynchronized 属性和 SyncRoot 属性,这两个属性被用来设计成以线程安全的方式访问和修改集合。不过这个设计让线程安全的访问有集合的实现方转嫁到了调用方,导致要么很难实现,要么很难调用。

虽然泛型版本的 ICollection<T> 已经改进了设计,不再引入 SyncRoot 这样的属性到接口中,但如果我们在某些场景下需要实现 ICollection 非泛型集合时,如何正确实现 SyncRoot 模式(SyncRoot Pattern)呢?

先上结论:

—— 不可能正确实现 SyncRoot 模式

在多线程程序设计中,为了在保证线程安全的同时避免死锁, 不应该公开同步锁 。而 ICollection 接口中的 SyncRoot 属性在接口中必然是公开的,于是没有任何途径可以保证调用方不会发生死锁。

于是实现 SyncRoot 的正确方法应该是:

—— 避免公开 SyncRoot 属性

所以 SyncRoot 模式应该这样实现:

  1. 使用显式接口实现,避免公开暴露此属性
  2. 抛出异常,避免调用者使用此属性

结合 .NET Core 源代码中的一些常用写法,我给出一个推荐的 SyncRoot 模式的写法:

// Is this List synchronized (thread-safe)?
bool ICollection.IsSynchronized => false;

// Synchronization root for this object.
object ICollection.SyncRoot => this;

嗯,没错,返回了 this ,这是各种同步时绝对不应该使用的对象。然而这个属性都是 public 了,不管返回什么,与 this 还有什么区别……

关于为什么同步时不应该返回 this 或者返回公开的对象,原因可以看我的另一篇博客:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

媒介融合

媒介融合

[丹]延森 / 刘君 / 复旦大学出版社 / 2012-9 / 32.00元

“媒介融合”是什么,如何来认识,本书提供的视角令人赞叹。 作为丹麦知名教授,延森具有欧陆学者的气质:思辨、批判。在延森看来,媒介融合带来了研究上的转向——从作为技术的媒介转向作为实践的传播,后者的一个中心命题是 特定的媒介与传播实践将对社会组织(从微观到宏观)产生何种影响? 解决上述问题,首先需要解决交流与传播观念的理论规范问题,本书就是阶段性的成果:基于对交流/传播观念史的考察,建构......一起来看看 《媒介融合》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试