我一直在阅读很多关于单身人士的信息,他们应该和不应该使用它们,以及如何安全地实施它们.我正在用C++ 11编写,并且遇到了Meyer对单例的懒惰初始化实现,如本问题所示.
这个实现是:
static Singleton& instance()
{
static Singleton s;
return s;
}
Run Code Online (Sandbox Code Playgroud)
我理解这对于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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我看第二个例子时,这是一个单例,它是非常直观的,因为该类拥有对其自身的一个实例的引用,并且只返回该实例.但是,在第一个示例中,我不明白这是如何防止存在对象的两个实例的.所以我的问题是:
谢谢你的帮助,
我正在审查一段使用大量单例类和访问的现有代码.我正在尝试提高此代码的性能.
想到的一件事是优化Singleton :: getInstance()代码片段.
而不是使用Singleton :: getInstance(),我倾向于用两个调用的结构替换它.
一个.一个可以创建和准备单例实例的函数,如Singleton :: prepareInstance(),它将在子系统的开头被调用一次.湾 getInstance()的内联实现,只返回引用而不检查它是否有效.
这是可行的解决方案吗?有什么方法可以改进吗?
我当前的Singleton :: getInstance()代码看起来像这样
Singleton * Singleton::getInstance() {
if(m_instance == NULL) {
m_instance = new Singleton();
}
return m_instance;
}
Run Code Online (Sandbox Code Playgroud)
πάνταῥεῖ提到的方法是否更快?