专栏首页walterlv - 吕毅的博客为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

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

非泛型版本的 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 或者返回公开的对象,原因可以看我的另一篇博客:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GitHub 的 Pull Request 和 GitLab 的 Merge Request 有区别吗?

    2017-10-12 01:13

    walterlv
  • WPF 中如何绑定附加属性?XAML 中记得加括号,C# 中记得不能用字符串

    在 XAML 中写绑定是 WPF 学习的必修课,进阶一点的,是用 C# 代码来写绑定。然而一旦绑定的属性是附加属性,好多小伙伴就会开始遇到坑了。

    walterlv
  • .NET 三个字母究竟应该如何大小写?前面的 “.” 什么时候能够去掉?(.NET Standard / dotnet-core / net472)

    发布于 2018-05-28 08:23 更新于 2018-07...

    walterlv
  • FreeSWITCH视频会议“标准”解决方案

    我们所谓的“标准”解决方案,并非是指这个解决方案是标准的。而是在做视频会议的过程中,FreeSWITCH作为一个服务器,会面对不同类型的客户端以及各种硬件的终端...

    LiveVideoStack
  • 杨老师课堂之JavaScript案例全选、全不选、及反选

            3.2当第一个按钮--全选--被单击 会 触发一个函数,此函数涉及到复选框全部选中功能,但是复选框一共有多少个是未知的,所以我们要去做一个循环,...

    杨校
  • CVPR 2020丨MAML-Tracker: 用目标检测思路做目标跟踪? 小样本即可得高准确率

    编者按:目标检测与目标跟踪这两个任务有着密切的联系。针对目标跟踪任务,微软亚洲研究院提出了一种通过目标检测技术来解决的新视角,采用简洁、统一而高效的“目标检测+...

    CV君
  • 绘图(四)小练习[画心]

    动态的绘制图形,需要使用到invalidate和postInvalidate函数,本次我们使用的是:

    李小白是一只喵
  • 全球首个获FDA认定治疗NASH的药物将于下半年申请上市!

    近日,生物制药公司Intercept Pharma计划于今年下半年在美国和欧洲提交obeticholic acid(奥贝胆酸,OCA)的上市申请文件。这款药物是...

    镁客网
  • Android开发之路--(1)

    版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47...

    Hankkin
  • ——HyperLeger Fabric智能合约(链码)

    在Fabric中,智能合约也称为链码(chaincode),分为用户链码和系统链码。系统链码用来实现系统层面的功能,包括系统的配置,用户链码的部署、升级,用户交...

    又建一梦

扫码关注云+社区

领取腾讯云代金券