我已经阅读了很多关于 Singletons 的内容,它们应该在什么时候使用,什么时候不应该使用,以及如何安全地实现它们。我正在用 C++11 编写,并且遇到了 Meyer 的单例延迟初始化实现,如本问题所示。
这个实现是:
static Singleton& instance()
{
static Singleton s;
return s;
}
我从 SO 上的其他问题中理解这是线程安全的,但我不明白这实际上是一个单例模式。我已经用其他语言实现了单例,这些总是像维基百科中的这个例子一样结束:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo ();
}
}
}
return instance;
}
}
当我看第二个例子时,它是一个单例是非常直观的,因为该类持有对它自己的一个实例的引用,并且只返回那个实例。但是,在第一个示例中,我不明白这如何阻止对象的两个实例存在。所以我的问题是:
- 第一个实现如何强制执行单例模式?我认为它与 static 关键字有关,但我希望有人可以深入向我解释引擎盖下发生的事情。
- 在这两种实现风格之间,一种比另一种更可取吗?优缺点都有什么?
谢谢你的帮助,