2011-01-09 4 views
0

나는 많은 스레드가 동시에 액세스하는 static 메서드가 있습니다. 스레드 안전성이 collection 인 경우이 메서드 반복은 크기가 변경되지 않습니다 (추가/삭제 안 함). 항목 당 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(); 
     } 
    } 
} 

그것이 성능을 향상 않고 배열 : 해당 항목이 Lazy 객체 내가 스레드 안전 하나를 (MEF은 그렇게)를 사용하는 Lazy 생성자에 액세스 할 필요가 없습니다 또는 많은 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

MEF를 사용하여 [스레드 세이프 게으른 인스턴스화] 반복 가능 (http://stackoverflow.com/questions/4633634)/thread-safe-lazy-instantiating-using-mef) –

답변

0

왜 그냥 항목 객체에 고정이 아닌 잠금의 배열을 만들?

e.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