美文网首页
懒汉单例模式 C++实现

懒汉单例模式 C++实现

作者: 假程序员 | 来源:发表于2019-03-08 01:06 被阅读0次
    //
    //  main.cpp
    //  lazy_singleton_pattern
    //
    //  Created by apple on 2019/3/8.
    //  Copyright © 2019年 apple. All rights reserved.
    //
    
    #include <iostream>
    
    class Example
    {
    private:
        static Example *single;//静态变量
        Example();
    public:
        static Example *GetSingleton();
        static void DestorySingle();
        void test();
    };
    
    Example *Example::single = NULL;//初始化静态变量为null
    Example::Example(){};
    Example *Example::GetSingleton()
    {
        if (single == NULL) {//在if判断中,存在线程安全问题
            single = new Example();
        }
        return single;
    }
    void Example::DestorySingle()
    {
        if (single != NULL)
        {
            delete single;
            single = NULL;
        }
    }
    void Example::test()
    {
        std::cout<<this<<std::endl;
    }
    
    int main(int argc, const char * argv[]) {
        Example *a = Example::GetSingleton();
        a->test();
        Example::DestorySingle();
        Example *b = Example::GetSingleton();
        a->test();
        b->test();
        return 0;
    }
    
    0x100454ef0
    0x100454ef0
    0x100454ef0
    Program ended with exit code: 0
    
        懒汉单例模式,什么是懒汉单例模式?懒汉单例模式不会迫切的需要单例对象,即在第一次需要该单例实例的时候才会生成该单例对象,之后再获取该单例实例时,该单例实例就是第一次获取时所生成的并返回的静态变量。
        根据单例模式特点,以一个静态方法返回一个静态变量,同时以懒汉为特点。我们可以这么做,在类加载的时候,将静态变量初始化为null。而根据懒汉的特点,我们需要在第一次调用静态方法时修改该静态变量的值,所以可以在静态方法中使用if语句判断该静态变量是否有值,若没有值,则给该静态变量重新赋值,再返回该静态变量。
        由上述创建过程会引发线程安全问题。假设同时有1000个线程在运行,并且该静态变量为null,此时这1000个线程同时调用静态方法,根据分时操作系统的特点,那么必然会存在部分线程在执行到if语句时,部分线程尚未执行到if语句,或部分线程已经执行过if语句,此时可能存在在执行对静态变量赋值操作的时候,该静态变量已由其他线程赋值,这样就导致了在同一时刻,创建了许多静态变量,并且许多静态变量都尚未使用就被抛弃了。这就是该懒汉单例模式的线程不安全性,
        针对线程不安全,本文不贴代码来解决线程不安全的问题,仅提供解决思路。既然是由同一时刻大量线程访问导致的线程不安全问题,那么我们可以让同一时刻只能有1个线程访问可能导致线程不安全的代码段,在该代码段执行结束之后,其他线程才能执行该代码段。即对代码段加锁保护该代码段,以达到同一时刻最多一个线程能够访问的目的。

    相关文章

      网友评论

          本文标题:懒汉单例模式 C++实现

          本文链接:https://www.haomeiwen.com/subject/xqxlpqtx.html