我看到使用静态只读对象的锁定很多,这个语句在下面给出的代码中有什么意义?我知道锁定应用于一个对象,这只是一个使锁定工作的对象,它只是一个黑客,因为我不需要任何对象,只是创建一个对象以使锁定工作?
而且只是说对象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; }
}
}
}
答案 0 :(得分:3)
使用单独的私有对象锁定recommended practice而不是已经存在的全局可见对象,因为其他代码的锁定决策干扰您的私有锁定方案的风险较低(这种问题非常严重)难以记录和诊断;所以最好让它们变得不可能。)
该locker对象需要是静态的,如果它是一个静态类,或者你的意图是应用程序范围的锁定;如果它只用于锁定单个对象实例,则它必须是一个实例对象,允许并发处理同一服务类或类层次结构中的其他对象。
显式读取性在这种特定情况下对性能没有直接影响,但在大多数其他情况下(主要通过防止重新加载)确实如此,因此标记所有只读对象是一种有用的习惯。 / p>
答案 1 :(得分:0)
拥有一个唯一目的是提供锁定的对象可以简化一些事情。为了防止外部代码弄乱你的锁并造成各种各样的悲伤,你真的想要一个完全可见的锁。最简单的方法是创建一个对象。 (如果你有另一个没有其他人可以访问的对象,你可以想象使用它......但是将锁与其他所有东西分开往往会使概念更简单。)
至于为什么它是静态的...这不是一个表现的东西,而是一个正确性。为了锁定静态方法或同步对静态资源的访问,您需要一个属于该类的对象,而不是一个实例。否则,每个实例都会锁定自己的锁而不是共享一个 - 除非只有一个实例,否则这将是非常无用的,即便如此也是如此。对于非静态方法,除非出于某种原因访问静态属性或类似的东西,否则不会使用static
。如果你确实使用它,并且不需要在实例之间同步访问,那么你最终会不必要地锁定并减慢速度。