关于c#线程中的锁的小查询

时间:2012-06-01 05:57:20

标签: c# thread-safety

我看到使用静态只读对象的锁定很多,这个语句在下面给出的代码中有什么意义?我知道锁定应用于一个对象,这只是一个使锁定工作的对象,它只是一个黑客,因为我不需要任何对象,只是创建一个对象以使锁定工作?

而且只是说对象obj1 = new object()我使用readonly和static,我想由于性能的提高,但readonly和static如何帮助提高性能?

static readonly object locker = new object();

代码如下:

class ThreadSafe 
{
  static bool done;
  static readonly object locker = new object();

  static void Main()
  {
    new Thread (Go).Start();
    Go();
  }

  static void Go()
  {
    lock (locker)
    {
      if (!done) { Console.WriteLine ("Done"); done = true; }
    }
  }
}

2 个答案:

答案 0 :(得分:3)

使用单独的私有对象锁定recommended practice而不是已经存在的全局可见对象,因为其他代码的锁定决策干扰您的私有锁定方案的风险较低(这种问题非常严重)难以记录和诊断;所以最好让它们变得不可能。)

该locker对象需要是静态的,如果它是一个静态类,或者你的意图是应用程序范围的锁定;如果它只用于锁定单个对象实例,则它必须是一个实例对象,允许并发处理同一服务类或类层次结构中的其他对象。

显式读取性在这种特定情况下对性能没有直接影响,但在大多数其他情况下(主要通过防止重新加载)确实如此,因此标记所有只读对象是一种有用的习惯。 / p>

答案 1 :(得分:0)

拥有一个唯一目的是提供锁定的对象可以简化一些事情。为了防止外部代码弄乱你的锁并造成各种各样的悲伤,你真的想要一个完全可见的锁。最简单的方法是创建一个对象。 (如果你有另一个没有其他人可以访问的对象,你可以想象使用它......但是将锁与其他所有东西分开往往会使概念更简单。)

至于为什么它是静态的...这不是一个表现的东西,而是一个正确性。为了锁定静态方法或同步对静态资源的访问,您需要一个属于该类的对象,而不是一个实例。否则,每个实例都会锁定自己的锁而不是共享一个 - 除非只有一个实例,否则这将是非常无用的,即便如此也是如此。对于非静态方法,除非出于某种原因访问静态属性或类似的东西,否则不会使用static。如果你确实使用它,并且不需要在实例之间同步访问,那么你最终会不必要地锁定并减慢速度。