如何锁定多个线程中使用的变量

Sim*_*One 15 c# multithreading locking

我在这里严重问了一个问题锁定多个线程中的变量,所以为了清楚起见,我将在这里问它并希望我能正确地问它.

classA
  creates instance of classB
  has methodA that can update & uses classB's myVar
  has methodB that can update & uses classB's myVar

classB
  has a variable myVar
Run Code Online (Sandbox Code Playgroud)

methodA和methodB都可以在不同的线程中运行(在main的新线程中调用).我如何确保这是线程安全的?

Bri*_*eon 21

使用lock关键字来保护可以由多个线程同时执行的代码.

public class ClassA
{
  private ClassB b = new ClassB();

  public void MethodA()
  {
    lock (b)
    {
      // Do anything you want with b here.
    }
  }

  public void MethodB()
  {
    lock (b)
    {
      // Do anything you want with b here.
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,lock不保护或锁定语句中使用的对象实例.相反,如果另一个使用相同对象实例的部分已在执行,则该对象用作标识应阻止执行的代码段的方法.换句话说,您可以在lock语句中使用您喜欢的任何对象实例,并且访问其成员仍然是安全的ClassB.

  • 为什么要锁b?为什么不创建第二个名为 bLock 的对象并锁定它呢?根据 b 的作用,您可能创建了线程不安全代码,我可以想到创建第二个对象没有任何缺点 (3认同)