Meyers如何实现Singleton实际上是Singleton

我已经阅读了很多有关Singleton的信息,何时应该使用以及不应该使用它们,以及如何安全地实现它们。我正在用C ++ 11编写,并且遇到了迈耶的单例的懒惰初始化实现。


该实现是:


static Singleton& instance()

{

     static Singleton s;

     return s;

}

我从SO上的其他问题中了解到线程安全性如何,但是我不明白的是这实际上是单例模式。我已经用其他语言实现了单例,并且这些总是以类似于Wikipedia的示例的形式结束:


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关键字有关,但我希望有人可以向我深入说明幕后情况。

在这两种实现方式之间,是否有一种比另一种更好?优缺点都有什么?

谢谢你的帮助,


叮当猫咪
浏览 780回答 2
2回答

LEATH

// Singleton.hppclass Singleton {public:    static Singleton& Instance() {        static Singleton S;        return S;    }private:    Singleton();    ~Singleton();};此实现称为Meyers'Singleton。斯科特·迈耶斯(Scott Meyers)说:“这种方法基于C ++的保证,即在调用该函数期间首次遇到对象的定义时,将初始化本地静态对象。” ...“此外,如果您从不调用模拟非本地静态对象的函数,那么就不会招致构造和破坏对象的费用。”Singleton& s=Singleton::Instance() 首次调用 时,将创建该对象,并在下一次调用Singleton::Instance()结果时返回同一对象。主要问题:受破坏订单惨败(相当于初始化订单惨败)的限制另一个实现称为可信任的泄漏Singleton。class Singleton {public:    static Singleton& Instance() {        if (I == nullptr) { I = new Singleton(); }        return *I;    }private:    Singleton();    ~Singleton();    static Singleton* I;};// Singleton.cppSingleton* Singleton::I = 0;两个问题:泄漏,除非您实施Release并确保调用它(一次)不是线程安全的
打开App,查看更多内容
随时随地看视频慕课网APP