我是SyncRoot概念的新手。据我所知,用于锁定的对象应该是私有(private)的。
但是HashTable
具有公共(public)属性SyncRoot
,它只是私有(private)SyncRoot对象的包装。枚举集合时,您锁定了HashTable.SyncRoot
就是recommended。
由于它不再是私有(private)的,因此似乎无法通过死锁失败。它真的是线程安全的吗?
如果我创建自己的私有(private)锁定机制该怎么办?private readonly object _syncObject;
哪一个更好,为什么?
最佳答案
不,这不是.NET 1.x方法的真正问题。该属性是公共(public)的,因为它必须是可公开访问的。问题在于枚举集合。没有任何方法可以以线程安全的方式实现该功能,没有机制可以在您开始枚举时自动锁定并在完成时自动解锁。 IEnumerable没有Completed方法,并且不继承IDisposable。
因此,为了允许代码安全地枚举,您需要访问锁对象。因此,您可以使用该对象上的锁包装foreach语句。因此是公共(public)的SyncRoot属性。
但是,许多程序员遇到的最大陷阱是假设没有必要。支持Synchronized属性为在所有情况下都是线程安全的集合返回线程安全包装器的概念。不是。