锁定跨多个线程使用的对象中的关键部分

时间:2009-12-10 14:29:18

标签: c# locking

我有一个在任意数量的线程中实例化的类,这些线程根据需要进行假脱机。这意味着可以在任何时候使用此类的任何数量的实例化版本,并且需要锁定此类的一部分以防止并发访问。

为了防止各种线程之间出现数据问题,我需要一种方法来锁定其他线程中其他实例化类的代码的一部分代码。由于可以运行此类的多个实例化版本,我不能只使用私有成员变量来锁定(我知道不使用Type或任何可公开访问的内容);所以我使用了私有静态成员变量。

这是解决这个问题的合理方法吗?或者有更好的解决方案吗?

以下示例代码:

public class MyClass
  {
    private static object LockingVar = new object();

    public void MyPublicMethod()
    {
      lock (LockingVar)
      {
         // Do some critical code
      }
  }

修改

MyPublicMethod正在调用本地SQLExpress实例,除了更新和插入之外,它还可以执行选择,所以它需要在另一个线程进入之前完成并将其搞砸。

3 个答案:

答案 0 :(得分:9)

对我来说很好看。我还将LockingVar标记为只读。

答案 1 :(得分:5)

是的,使用您的示例代码,您将获得有关该类所有实例的方法的全局关键部分。

如果这就是你要找的东西(你必须问自己,你是否真的想一次只有一个线程运行该方法),你也可以使用[MethodImpl(MethodImplOptions.Synchronized)]来帮助你相同的功能。

[MethodImpl(MethodImplOptions.Synchronized)]
public static void MyPublicMethod()
{
     // Do some critical code
}

注意:如果它是实例方法,则相当于写lock(this){};如果是类(静态)方法,则相当于lock(typeof(MyClass))。两者都皱眉,所以你的lock(obj)模式更好。

答案 2 :(得分:2)

来自MSDN:

最佳做法是定义要锁定的私有对象,或私有静态对象变量以保护所有实例共有的数据。

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

因此,您的实施似乎是正确的。