21xrx.com
2024-12-27 14:50:30 Friday
登录
文章检索 我的文章 写文章
C++单例模式的几种实现方式
2023-07-04 18:37:27 深夜i     --     --
C++ 单例模式 实现方式

单例模式是设计模式中的一种,它的主要作用是保证一个类只有一个实例。在实际项目开发中,我们经常需要使用单例模式来管理全局变量、线程池、数据库连接等资源,以保证程序的运行效率和数据的可靠性。

在C++中,单例模式有多种实现方式,下面我们将介绍几种常用的实现方式:

1.饿汉式

饿汉式是最简单的单例实现方式,它的实现思想是利用静态变量的特点,在程序启动时即创建一个全局的实例对象。这种方式在多线程环境下可能会存在线程安全问题,需要在实现时进行加锁操作。


class Singleton{

public:

  static Singleton* getInstance()

    return &instance;

  

private:

  static Singleton instance;

  Singleton(){}

};

Singleton Singleton::instance;   //在类定义外部初始化静态成员变量

int main(){

  Singleton* s = Singleton::getInstance();

  return 0;

}

2.懒汉式

懒汉式是一种更为常见的单例实现方式,它的实现思想是在需要时再创建实例对象。在多线程环境下需要加锁,以保证线程安全。但是由于加锁开销较大,可能会影响程序的性能。


class Singleton{

public:

  static Singleton* getInstance(){

    if(instance == NULL){    //判断是否已经创建实例

      mutex.lock();      //加锁

      if(instance == NULL){

        instance = new Singleton();

      }

      mutex.unlock();     //解锁

    }

    return instance;

  }

private:

  static Singleton* instance;

  static std::mutex mutex;   //加锁保证线程安全

  Singleton(){}

};

Singleton* Singleton::instance = NULL;

std::mutex Singleton::mutex;   //初始化互斥锁

int main(){

  Singleton* s = Singleton::getInstance();

  return 0;

}

3.双检锁

双检锁是懒汉式的升级版,它利用两次判断的方式,以减少加锁的开销。在第一次判断时,若实例已经创建则无需加锁,直接返回实例对象;否则进行加锁操作,并在进入临界区后再次进行一次判断,以防止多次创建实例对象。


class Singleton{

public:

  static Singleton* getInstance(){

    if(instance == NULL){    //第一次判断

      mutex.lock();      //加锁

      if(instance == NULL){  //第二次判断

        instance = new Singleton();

      }

      mutex.unlock();     //解锁

    }

    return instance;

  }

private:

  static Singleton* instance;

  static std::mutex mutex;   //加锁保证线程安全

  Singleton(){}

};

Singleton* Singleton::instance = NULL;

std::mutex Singleton::mutex;   //初始化互斥锁

int main(){

  Singleton* s = Singleton::getInstance();

  return 0;

}

4.局部静态变量

局部静态变量是一种省去了手动进行内存管理操作的方法,它的实现方式是将实例对象定义在getInstance函数内部的静态变量中,可以避免在多线程环境下进行加锁解锁操作。


class Singleton{

public:

  static Singleton* getInstance()

    static Singleton instance;

    return &instance;

  

private:

  Singleton(){} 

};

int main(){

  Singleton* s = Singleton::getInstance();

  return 0;

}

总结:以上介绍了C++中单例模式的几种实现方式,每种方式都有自己的优缺点。在实际开发中,应根据具体情况选择合适的实现方式,以达到最优的性能和稳定性。同时,为了保证更好的代码可读性和可维护性,建议在实现单例模式时遵循相关的编程规范和设计原则。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复