我应该使用不同的对象来锁定每个属性吗?

Nic*_*ick 5 c# multithreading locking

我有一个班级及其属性; 不同的线程经常访问这些属性.

为每个属性使用相同的对象(对于lock语句)更有效吗?

private readonly object padlock = new object();

private string name;
private int age;

public string Name
{
   get
   {
      lock(padlock)
         return name;
   }

   set
   {
      lock(padlock)
         name = value;
   }
}

public int Age
{
   get
   {
      lock(padlock)
         return age;
   }

   set
   {
      lock(padlock)
         age = value;
   }
}
Run Code Online (Sandbox Code Playgroud)

或者为每个属性使用不同的对象?

private readonly object padlockName = new object();
private readonly object padlockAge = new object();

private string name;
private int age;

public string Name
{
   get
   {
      lock(padlockName)
         return name;
   }

   set
   {
      lock(padlockName)
         name = value;
   }
}

public int Age
{
   get
   {
      lock(padlockAge)
         return age;
   }

   set
   {
      lock(padlockAge)
         age = value;
   }
}
Run Code Online (Sandbox Code Playgroud)

第二个版本有意义吗?

cas*_*One 0

请注意,这很大程度上取决于对象的访问方式。最终的答案将通过测量您在环境中的性能并根据该性能以及您的域的特定需求采取行动来确定尽管在这里似乎关心的是破坏用于支持属性的变量,而不是访问属性集群同时)。

也就是说,您必须平衡以下各项:

  • 如果您有一个对象来锁定对该对象上所有属性的访问,则访问不同属性的多个线程将互相等待完成。

  • 如果每个属性有一个对象,那么访问不同的属性将不会导致锁等待。

然而,我想说在这种情况下它没有实际意义,因为你似乎更担心这里价值观的腐败。

绝大多数类型(不包括多字段值类型)的赋值和读取都是原子的,这意味着您不会破坏它们。

也就是说,在上面的示例中,您对类型string(引用类型)和 an 的属性进行读取和写入int,这些操作是原子的,不会被多个线程的读取/写入破坏。