2011-01-09 12 views
0

私はstaticメソッドを持っており、同時に多くのスレッドからアクセスされます。スレッドセーフの場合、collectionこのメソッドはサイズ変更されません(追加/削除なし)。その項目に注意することはLazyオブジェクトであり、私は(ないことをMEF)スレッドセーフなものを使用するLazyコンストラクタへのアクセスを持っていない:私はアイテムごとに使用して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はパフォーマンスの向上よりも多くの副作用がありますか?

そして
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

理由だけアイテムオブジェクトのロックではなく、ロックの配列を作成しませんか?

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

関連する問題