ICollection,只读集合和同步.这是正确的吗?

Mat*_*ley 6 c# .net-2.0

我有一个实现的自定义类,ICollection这个类是只读的,即.IsReadOnly返回true(与使用readonly关键字相反),以及通常会修改集合中数据的所有函数InvalidOperationException.

现在,给定这样的结构,并在实现ICollection(特别是ICollection.IsSynchronized朋友)时快速浏览线程安全问题,我提出了这个快速而肮脏的解决方案.

bool ICollection.IsSynchronised { get{ return true; } }
object ICollection.SyncRoot { get{ return new Object(); } }
Run Code Online (Sandbox Code Playgroud)

现在,考虑到MSDN中的示例,这不会导致不同的线程正确锁定,因为它们从中获取不同的对象SyncRoot.鉴于这是一个只读集合,这是一个问题吗?返回时是否存在内存/ GC问题new Object()?您可以通过此实现看到的任何其他问题?

Kim*_*moz 4

是的,在某些情况下这是一个问题。尽管集合是只读的且无法更改,但集合引用的对象也不是只读的。因此,如果客户端使用 SyncRoot 执行锁定,那么在修改集合引用的对象时,它们将不是线程安全的。

我建议添加:

private readonly object syncRoot = new object();
Run Code Online (Sandbox Code Playgroud)

到你的班级。将其作为 SyncRoot 返回,然后就可以开始了。