C# SynchronizedCollection<;T>;还有其他并发的集合?

C# SynchronizedCollection<;T>;还有其他并发的集合?,c#,collections,.net-4.0,thread-safety,concurrent-collections,C#,Collections,.net 4.0,Thread Safety,Concurrent Collections,除了作为命名空间的并发集合和作为类的SynchronizedCollection之外,System.collections.concurrent命名空间中的SynchronizedCollection和并发集合有何不同 SynchronizedCollection和并发集合中的所有类都提供线程安全的集合。如何决定何时使用一个而不是另一个,以及为什么?在.NET 2.0中首先引入了,以提供线程安全的收集类。它通过锁定来实现这一点,因此您基本上拥有一个列表,其中每个访问都被包装在lock语句中 名称

除了作为命名空间的并发集合和作为类的
SynchronizedCollection
之外,
System.collections.concurrent
命名空间中的
SynchronizedCollection
和并发集合有何不同

SynchronizedCollection
和并发集合中的所有类都提供线程安全的集合。如何决定何时使用一个而不是另一个,以及为什么?

在.NET 2.0中首先引入了,以提供线程安全的收集类。它通过锁定来实现这一点,因此您基本上拥有一个
列表
,其中每个访问都被包装在
lock
语句中

名称空间要新得多。它直到.NET4.0才被引入,它包含了一组经过实质性改进且更加多样化的选项。这些类不再使用锁来提供线程安全,这意味着在多个线程同时访问其数据的情况下,它们应该可以更好地扩展。但是,在这些选项中,实现IList接口的类明显不存在

因此,如果您的目标是.NET Framework的4.0版,则应尽可能使用
System.collections.Concurrent
命名空间提供的集合之一。正如在中提供的各种类型的集合之间进行选择一样,您需要选择其特性和特性最适合您特定需要的集合

如果您的目标是.NET Framework的较旧版本,或者需要实现
IList
接口的集合类,则必须选择
SynchronizedCollection


这篇关于MSDN的文章也值得一读:

在这里看一看:因此,我更喜欢System.Collections.Concurrent而不是SynchrinozedCollection,因为我使用的是4.0版!!如果这些新的并发集合不使用锁来实现线程安全,那么如何实现并发性?@Matt:各种方法。答案可能足够复杂,值得提出自己的问题。但要想获得灵感,请看这里:还有这里:(另外,您是否阅读了我链接到的MSDN文章?它简要总结了它们使用的技巧,而不是锁定,尽管可能不足以编写您自己的实现。)感谢您提供的信息。这是一个很好的一个小时左右的阅读时间,我甚至不知道.NET中存在着什么东西(但仍然没有完全理解)@Matt,.NET4并发类使用SpinWait对象来解决线程安全问题,而不是Monitor.Enter/Exit(也称为Critical部分)。不同之处在于,SpinWait结构试图保持线程运行并等待信号继续,而临界段执行一个屈服(也称为线程上下文切换),然后定期返回线程并检查它是否可以继续。CS的速度很快,但在某些情况下,如果受保护的代码执行得很快,则SpinWait会产生更好的性能。