手撕单例模式 (懒汉式 双重锁机制)

  • 什么是单例模式?

单例模式就是一个类只能被实例化一次 ,更准确的说是只能有一个实例化的对象的类。(确保内存中只有一个的对象,该实例必须自动创建,并且对外提供)

  • 优点

在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。

  • 缺点

没有抽象层,因此扩展很难

职责过重,在一定程序上违背了单一职责

  • 分类

懒汉式和饿汉式(线程不安全)

饿汉式单例在单例类被加载时候,就实例化一个对象并交给自己的引用(返回一个实例化对象);

而懒汉式单例只有在真正使用的时候才会实例化一个对象并交给自己的引用。

实现单例模式的方式(饿汉式):

类中声明一个静态的本类指针,再写一个public的函数来让这个指针指向我们新创建的实例,返回这个指针(这个实例的地址),并进行加锁,这个对象就永远只有一份,然后单例模式就实现了。

class CSingleton
{
private:
    //构造函数必须是私有,这样在外部便无法使用 new 来创建该类的实例
    CSingleton()
    {
        pthread_mutex_init(&mtx,0);
    }
    //定义一个私有的静态全局变量来保存该类的唯一实例
    static CSingleton *p; 
public:
    static pthread_mutex_t mtx;
    //定义一个全局访问点 设置为静态方法 则在类的外部便无需实例化就可以调用该方法
    static CSingleton* getInstance()
    {
        //保证只实例化一次即在第一次调用时实例化,以后调用便不会再实例化
        if(p == NULL)
        {
            pthread_mutex_lock(&mtx);
            if(p==NULL)
            {
                p = new CSingleton();
            }
            pthread_mutex_unlock(&mtx);
        }
        return p;
    }
};
pthread_mutex_t CSingleton::mtx;
CSingleton* CSingleton::p = NULL;
  • 双重锁机制使用的原因

第一层的if,new出第一个实例后,后面每个线程访问到最外面的if判断就直接返回了,没有加锁的开销

第二层If, 判断类对象指针为空,才进行实例

锁机制:保证同一时刻只有一个线程访问(即进行实例化)

  • 单例模式(懒汉式)

不管有没有地方需要获取实例对象,都在类加载的时候直接实例话对象出来。此中方式类加载比较慢,但是获取实例对象比较快。直接定义一个private的属性,并直接初始化.

class CSingleton
{
private:
    //构造函数必须是私有,这样在外部便无法使用 new 来创建该类的实例
    CSingleton()
    {
    }
    //定义一个私有的静态全局变量来保存该类的唯一实例
    static CSingleton *p=new CSingleton();
public:
    static CSingleton* getInstance()
    {  
        return p;
    }
};

 

你可能感兴趣的:(c++)