使用每个项锁定循环内部

时间:2011-01-09 22:10:55

标签: c# performance loops thread-safety

我有一个static方法,可以被多个线程同时访问。对于线程安全collection,迭代的方法不会改变大小(不添加/不删除)。请注意,该项是Lazy对象,我无权访问Lazy构造函数以使用线程安全的(MEF这样做):

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

1 个答案:

答案 0 :(得分:0)

为什么不直接锁定item对象,而不是创建一个锁数组?

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