Choosing an appropriate data structure for your concurrent algorithm is a crucial step. We have already learned from the previous chapters that it is not usually possible to use just any .NET object as a shared data in a multithreaded program. We can assume that most of the common types in .NET are implemented in such a way that their static members are thread-safe, while their instance members are not. However, only those objects that are specifically designed to be thread-safe can be used as they are in a multithreaded environment.
Therefore, if we need multiple threads to add some item to a collection, we cannot just call the Add
method of a shared instance of the List<T>
type. It will lead to unpredictable results, and most probably the program will end up throwing a weird exception.
Thus, in this situation, there are two general ways to follow: either we implement synchronized access to the standard collection ourselves with the help of...