Thread-Safe lazy instantiating using MEF

Posted by Xaqron on Stack Overflow See other posts from Stack Overflow or by Xaqron
Published on 2011-01-08T11:27:22Z Indexed on 2011/01/09 21:53 UTC
Read the original article Hit count: 169

Filed under:
|
|
|
|
// Member Variable
private static readonly object _syncLock = new object();

// Now inside a static method

foreach (var lazyObject in plugins)
{
   if ((string)lazyObject.Metadata["key"] = "something")
   {
      lock (_syncLock)
      {
         // It seems the `IsValueCreated` is not up-to-date
         if (!lazyObject.IsValueCreated) 
            lazyObject.value.DoSomething();
      }
      return lazyObject.value;
   }
}

Here I need synchronized access per loop. There are many threads iterating this loop and based on the key they are looking for, a lazy instance is created and returned.

lazyObject should not be created more that one time. Although Lazy class is for doing so and despite of the used lock, under high threading I have more than one instance created (I track this with a Interlocked.Increment on a volatile static int and log it somewhere). The problem is I don't have access to definition of Lazy and MEF defines how the Lazy class create objects. I should notice the CompositionContainer has a thread-safe option in constructor which is already used.

My questions:

1) Why the lock doesn't work ?

2) Should I use an array of locks instead of one lock for performance improvement ?

© Stack Overflow or respective owner

Related posts about c#

Related posts about multithreading