gpt4 book ai didi

c# - ICollection、只读集合和同步。这是正确的吗?

转载 作者:太空狗 更新时间:2023-10-29 21:26:00 28 4
gpt4 key购买 nike

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

现在,有了这样的构造,并快速浏览了实现 ICollection(特别是 ICollection.IsSynchronized 和 friend )时的线程安全问题,我想出了这个快速而肮脏的解决方案。

bool ICollection.IsSynchronised { get{ return true; } }
object ICollection.SyncRoot { get{ return new Object(); } }

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

最佳答案

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

我建议添加:

private readonly object syncRoot = new object();

到你的类(class)。将其作为 SyncRoot 返回,您就可以开始了。

关于c# - ICollection、只读集合和同步。这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211448/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com