1

I want to have a generic thread safe collection and I saw that the Arraylist can easily be used thread safe by its static Synchronized method but what bugs me is that this ArrayList is not generic so when I want to use my objects I always have to cast them. Is there an easier way to do this? Also other list types would be possible.

1
  • and yes I could wrap the ArrayList perhaps any other solutions? :) Commented Aug 14, 2009 at 14:01

3 Answers 3

3

A little knowledge is a dangerous thing ;-) Yes, you could use Meta-Knight's suggestion and use SyncRoot, but you need to be careful - it's not a panacea. See this post from the BCL Team Blog from Microsoft to see why it's not as simple as SyncRoot. Quotes from that post:

A few astute users of our generic collections observed that we no longer provide a public SyncRoot property on ICollection<T>

and

I think we're better off forcing people to think more heavily about synchronization, and frankly a SyncRoot property on our generic collections doesn't provide any value.

Of course, that's not to say it can't be used under any circumstances - you just have to think the use cases through carefully and not be on auto-pilot.

Sign up to request clarification or add additional context in comments.

Comments

3

If you read on MSDN regarding the synchronized method is still says this:

"Enumerating through a collection is intrinsically not a thread-safe procedure. Even when a collection is synchronized, other threads can still modify the collection, which causes the enumerator to throw an exception. To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads."

Comments

3

You could create a List(T) wrapper and synchronize access with the SyncRoot property.

MSDN example:

ICollection ic = ...;
lock (ic.SyncRoot) 
{
    // Access the collection.
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.