2011-01-09 2 views
0

У меня есть метод static, к которому обращаются многие потоки одновременно. Для обеспечения безопасности потоков collection этот метод, который выполняет итерацию, не изменится - это размер (без добавления/отсутствия удаления). Обратите внимание, что элемент является Lazy объектом и у меня нет доступа к Lazy конструктору использовать поточно-один (MEF сделать):Использование per item locks внутри цикла

private static readonly object _syncLock = new object(); 

// Now inside a static method 

private static DoSomethingOnItem(string wanted) 
{ 
    foreach (var item in items) 
    { 
     if (item.Metadata["Name"] = wanted) 
     { 
     lock (_syncLock) 
      item.DoSomething(); 
     } 
    } 
} 

ли это повысить производительность, если я использую и массив locks за единицу или многие locks имеют больший побочный эффект, а не повышение производительности?

private static object[] _syncLocks; 
// Code... 
_syncLocks = new object[itemsCount]; // in a thread-safe manner 

Затем в цикле использовать каждый item специфический lock

+3

Вместо этого используйте 'ReaderWriterLockSlim'. Не нужно изобретать велосипед. :) http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx – bzlm

+0

Возможное повторение [Thread-Safe ленивый экземпляр с использованием MEF] (http://stackoverflow.com/questions/4633634/thread-safe-lazy-instantiating-using-mef) –

ответ

0

Почему не просто зафиксировать на объекте элемента, а не создать массив замков?

I.e.

private static void DoSomethingOnItem(string wanted) 
{ 
    foreach (var item in items) 
    { 
     if (item.name == wanted) 
     { 
     lock (item) 
      item.DoSomething(); 
     } 
    } 
} 
+0

Элемент 'Lazy' здесь, поэтому перед вызовом DoSomething()' нет экземпляра. – Xaqron

+0

@Xaqron: если элемент не существует, как вы тестируете его имя? –

+0

Автор: 'Метаданные. Я отредактирую. – Xaqron

Смежные вопросы