内容简介:非泛型版本的虽然泛型版本的先上结论:
非泛型版本的 ICollection
中有 IsSynchronized
属性和 SyncRoot
属性,这两个属性被用来设计成以线程安全的方式访问和修改集合。不过这个设计让线程安全的访问有集合的实现方转嫁到了调用方,导致要么很难实现,要么很难调用。
虽然泛型版本的 ICollection<T>
已经改进了设计,不再引入 SyncRoot
这样的属性到接口中,但如果我们在某些场景下需要实现 ICollection
非泛型集合时,如何正确实现 SyncRoot 模式(SyncRoot Pattern)呢?
先上结论:
—— 不可能正确实现 SyncRoot 模式
在多线程程序设计中,为了在保证线程安全的同时避免死锁, 不应该公开同步锁 。而 ICollection
接口中的 SyncRoot
属性在接口中必然是公开的,于是没有任何途径可以保证调用方不会发生死锁。
于是实现 SyncRoot
的正确方法应该是:
—— 避免公开 SyncRoot 属性
所以 SyncRoot 模式应该这样实现:
- 使用显式接口实现,避免公开暴露此属性
- 抛出异常,避免调用者使用此属性
结合 .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
或者返回公开的对象,原因可以看我的另一篇博客:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 深度解析属性动画的思想 - 带你手动实现属性动画框架
- 私有属性的实现
- UIView中frame属性的内部实现
- 带你了解vue计算属性的实现原理以及vuex的实现原理
- React源码分析与实现(二):状态、属性更新 -> setState
- golang接口的使用:给实现类中属性赋值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python Web开发:测试驱动方法
Harry J.W. Percival / 安道 / 人民邮电出版社 / 2015-10 / 99
本书从最基础的知识开始,讲解Web开发的整个流程,展示如何使用Python做测试驱动开发。本书由三个部分组成。第一部分介绍了测试驱动开发和Django的基础知识。第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。一起来看看 《Python Web开发:测试驱动方法》 这本书的介绍吧!
正则表达式在线测试
正则表达式在线测试
HSV CMYK 转换工具
HSV CMYK互换工具