What is the difference between SynchronizedCollection<T> and the other concurrent collections?

c#, concurrency, concurrent-collections, synchronizedcollection, thread-safety

Solution

The `SynchronizedCollection<T>` class was introduced first in .NET 2.0 to provide a thread-safe collection class. It does this via locking so that you essentially have a `List<T>` where every access is wrapped in a `lock` statement.

The `System.Collections.Concurrent` namespace is much newer. It wasn't introduced until .NET 4.0 and it includes a substantially improved and more diverse set of choices. These classes no longer use locks to provide thread safety, which means they should scale better in a situation where multiple threads are accessing their data simultaneously. However, a class implementing the `IList<T>` interface is notably absent among these options.

So, if you're targeting version 4.0 of the .NET Framework, you should use one of the collections provided by the `System.Collections.Concurrent` namespace whenever possible. Just as with choosing between the various types of collections provided in the `System.Collections.Generic` namespace, you'll need to choose the one whose features and characteristics best fit your specific needs.

If you're targeting an older version of the .NET Framework or need a collection class that implements the `IList<T>` interface, you'll have to opt for the `SynchronizedCollection<T>` class.

This article on MSDN is also worth a read: When to Use a Thread-Safe Collection

Problem

How does `SynchronizedCollection<T>` and the concurrent collections in the `System.Collections.Concurrent` namespace differ from each other, apart from Concurrent Collections being a namespace and `SynchronizedCollection<T>` being a class? `SynchronizedCollection<T>` and all of the classes in Concurrent Collections provide thread-safe collections. How do I decide when to use one over the other, and why?

Original source

Related problems