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

Nat*_*han 10 c# locking

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

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

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

示例代码如下:

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

    public void MyPublicMethod()
    {
      lock (LockingVar)
      {
         // Do some critical code
      }
  }
Run Code Online (Sandbox Code Playgroud)

编辑

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

Ric*_*dOD 9

看起来很好.我还将LockingVar标记为readonly.

  • @RichardOD仅仅为了我的理解,为什么要将私有字段标记为只读? (4认同)

Yan*_*rtz 5

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

如果这就是您要查找的内容(并且您必须问自己,是否真的想一次只让一个线程运行该方法),则还可以使用[MethodImpl(MethodImplOptions.Synchronized)]来获得与您基本相同的功能。

[MethodImpl(MethodImplOptions.Synchronized)]
public static void MyPublicMethod()
{
     // Do some critical code
}
Run Code Online (Sandbox Code Playgroud)

注意:lock(this){}如果是实例方法或lock(typeof(MyClass))类(静态)方法,则相当于要写。两者都不满意,因此您的lock(obj)模式更好。