首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SyncRoot对象真的是线程安全的吗?

SyncRoot对象真的是线程安全的吗?
EN

Stack Overflow用户
提问于 2012-01-06 20:10:50
回答 2查看 2.1K关注 0票数 3

我是SyncRoot概念的新手。据我所知,用于锁定的对象应该是私有的。

但是,HashTable有一个公共属性SyncRoot,它只是私有SyncRoot对象的包装器。枚举集合时锁定在HashTable.SyncRoot上的是recommended

看起来我们可能会因为死锁而失败,因为它不再是私有的。它真的是线程安全的吗?

如果我创建自己的私有锁定机制呢?private readonly object _syncObject;

哪一个更好?为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-06 21:44:18

不,这不是.NET 1.x方法的真正问题。属性是公共的,因为它必须是可公开访问的。问题在于枚举集合。没有任何办法以线程安全的方式实现它,也没有机制在开始枚举时自动锁定,在枚举完成时解锁。IEnumerable没有完整的方法,也不继承IDisposable。

因此,为了允许代码安全地枚举,您需要访问lock对象。因此,您可以使用该对象上的锁来包装foreach语句。这样就有了公共SyncRoot属性。

然而,许多程序员落入的最大熊陷阱是认为这是不必要的。相信Synchronized属性为集合返回线程安全包装器的概念,该包装器在任何情况下都是线程安全的。事实并非如此。

票数 7
EN

Stack Overflow用户

发布于 2012-01-06 20:13:52

ICollection.SyncRoot只在预泛型集合上。它基本上已经过时了。

由于您提到的原因,在泛型集合中将其删除-您应该使用自己的锁定机制来控制对具有所需属性的集合的访问(保持锁定为私有,避免死锁...),而不是使用SyncRoot对象,然后假设您的代码是神奇的线程安全的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8757610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档