设计模式之单例模式

先看代码

class Singleton{
public:
   //获取实例接口
   static Singleton * getInstance(){
       if (m_instance == nullptr){
           m_instance = new Singleton();
       }
       return m_instance;
   }
private:
   //构造函数私有化,不允许使用者生成对像。
   Singleton();
   Singleton(const Singleton& other);
   //静态成员变量
   static Singleton * m_instance:
}
//静态成员初始化
Singleton* Singleton::m_instance = nullptr;

这是C++中最基本的单例模式实现方法,但是他不是线程安全的,在多线程调用的情况下,可能线程A调用了getInstance(),在new 还没有完成的时间,线程B也调用了getInstance().就会出现问题。当然,我们可以在使用多线程之前调用一次,即可解决这个问题。
在C++ 11中,C++ 保证静态局部变量初始化过程是线程安全的。因此我们可以用以下方式,简单快捷的实现线程安全版的单例模式。

class Singleton{
public:
   //获取实例接口
   static Singleton& getInstance(){
       static Singleton m_instance;
       return m_instance;
   }
private:
   //构造函数私有化,不允许使用者生成对像。
   Singleton();
   Singleton(const Singleton& other);
}

Java中实现单例模式类似可以使用synchronized来实现线程安全,这程称为懒汉式

//懒汉式单例 线程安全实现
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

还可以基于 classloader 机制避免多线程的同步问题(饿汉式)

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
posted on 2022-03-13 00:01  曹操是个好同志  阅读(17)  评论(0编辑  收藏  举报