我是SyncRoot概念的新手。据我所知,用于锁定的对象应该是私有的。
但是,HashTable有一个公共属性SyncRoot,它只是私有SyncRoot对象的包装器。枚举集合时锁定在HashTable.SyncRoot上的是recommended。
看起来我们可能会因为死锁而失败,因为它不再是私有的。它真的是线程安全的吗?
如果我创建自己的私有锁定机制呢?private readonly object _syncObject;
哪一个更好?为什么?
发布于 2012-01-06 21:44:18
不,这不是.NET 1.x方法的真正问题。属性是公共的,因为它必须是可公开访问的。问题在于枚举集合。没有任何办法以线程安全的方式实现它,也没有机制在开始枚举时自动锁定,在枚举完成时解锁。IEnumerable没有完整的方法,也不继承IDisposable。
因此,为了允许代码安全地枚举,您需要访问lock对象。因此,您可以使用该对象上的锁来包装foreach语句。这样就有了公共SyncRoot属性。
然而,许多程序员落入的最大熊陷阱是认为这是不必要的。相信Synchronized属性为集合返回线程安全包装器的概念,该包装器在任何情况下都是线程安全的。事实并非如此。
发布于 2012-01-06 20:13:52
ICollection.SyncRoot只在预泛型集合上。它基本上已经过时了。
由于您提到的原因,在泛型集合中将其删除-您应该使用自己的锁定机制来控制对具有所需属性的集合的访问(保持锁定为私有,避免死锁...),而不是使用SyncRoot对象,然后假设您的代码是神奇的线程安全的。
https://stackoverflow.com/questions/8757610
复制相似问题