这个锁用法线程安全吗?

May*_*aya 5 c# synchronization locking

我知道使用lock(this)或任何共享对象是错误的.

我想知道这种用法是否合适?

public class A
{
  private readonly object locker = new object();
  private List<int> myList;
  public A()
  {
    myList = new List<int>()
  }

  private void MethodeA()
  {
    lock(locker)
    {
      myList.Add(10);
    }
  }

  public void MethodeB()
  {
    CallToMethodInOtherClass(myList);
  }
}

public class OtherClass
{
  private readonly object locker = new object();
  public CallToMethodInOtherClass(List<int> list)
  {
   lock(locker)
   {
     int i = list.Count;
   }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个线程安全吗?在OtherClass我们锁定私有对象,所以如果class A锁具有其私有锁,列表仍然可以在锁定块中更改OtherClass

Ste*_*ger 10

不,这不是线程安全的.添加和计数可以在"相同"时间执行.您有两个不同的锁定对象.

传递列表时始终锁定自己的锁定对象:

  public void MethodeB()
  {
    lock(locker)
    {
      CallToMethodInOtherClass(myList);
    }
  }
Run Code Online (Sandbox Code Playgroud)