// 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;
}
}
Здесь мне нужен синхронизированный доступ за цикл.Существует много потоков, повторяющих этот цикл, и на основе key
, который они ищут, создается и возвращается ленивый экземпляр.
lazyObject
не следует создавать более одного раза.Хотя класс Lazy
предназначен для этого и, несмотря на используемую блокировку, при высокой потоке я создал более одного экземпляра (я отслеживаю это с Interlocked.Increment
на volatile
static int
и регистрирую его где-нибудь).Проблема в том, что у меня нет доступа к определению Lazy
, а MEF
определяет, как класс Lazy
создает объекты.Я должен заметить, что CompositionContainer
имеет поточно-ориентированный параметр в конструкторе, который уже используется.
Мои вопросы:
1) Почему блокировка не работает?
2) Должен ли я использовать массив блокировок вместо одной блокировки для повышения производительности?