gpt4 book ai didi

c# - 我一直都在做错锁吗?

转载 作者:太空狗 更新时间:2023-10-30 00:01:52 24 4
gpt4 key购买 nike

我正在阅读 this article关于单例中的线程安全,这让我觉得我不理解 lock 方法。

在第二个版本中,作者是这样的:

public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();

Singleton()
{
}

public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}

而我会做更像这样的事情:

public sealed class Singleton
{
private static Singleton instance = null;

Singleton()
{
}

public static Singleton Instance
{
get
{
lock (instance)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}

为什么要使用挂锁对象,而不是锁定您要锁定的实际对象?

最佳答案

在您锁定对象之前,您第一次访问 Instance 属性时会发生什么情况?

(提示:lock(null) 爆炸...)

作为一项单独的措施,我几乎总是避免锁定“实际对象”——因为通常很可能还有其他代码暴露了该引用,而我不一定知道要锁定的是什么。即使您的版本确实有效,如果一些外部代码这样写会发生什么:

// Make sure only one thread is ever in this code...
lock (Singleton.Instance)
{
// Do stuff
}

现在没有其他人甚至可以在该代码执行时获取实例,因为它们最终会被 getter 阻塞。 getter 中的锁并不是为了防止这种情况 - 它只是为了防止 getter 中的多次访问

您对锁的控制越严密,就越容易推断它们并避免死锁。

偶尔在以下情况下锁定“正常”对象:

  • 我不会在该类之外公开该引用
  • 我有信心类型本身(当然,它总是引用 this)不会锁定自己。

(所有这些都是避免锁定 this 的原因,当然......)

从根本上说,我认为允许您锁定任何对象的想法在 Java 中是一个坏主意,在 .NET 中复制它也是一个糟糕的举动 :(

关于c# - 我一直都在做错锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9420608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com