C++单例模式的几种实现方式研究
什么是单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证了一个类仅有一个实例,并提供一个全局访问点。
单例模式的应用场景
单例模式在以下情况下被广泛应用:
- 需要频繁创建对象,但创建的对象又非常耗费系统资源。
- 系统只需要一个实例对象,如系统日志、系统文件等。
- 当多个实例存在时会导致访问的内容不一致或者状态不同步。
如何实现单例模式
饿汉式
饿汉式在类加载时就创建了对象实例,也就是说在调用该类的getInstance()方法之前就已经存在了该对象,因此线程安全,但可能会浪费一部分系统资源。
示例代码:
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton();
懒汉式
懒汉式在调用该类的getInstance()方法时才会创建对象实例,因此只有在使用时才会创建对象,避免了资源浪费,但线程不安全。
示例代码:
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
双检锁/双重校验锁(DCL)
双检锁是指在getInstance()方法中进行双重判断,避免了资源的浪费和线程不安全问题。
示例代码:
class Singleton {
private:
static Singleton* instance;
static std::mutex mutex_;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mutex_);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;
静态变量
静态变量在程序启动时就创建了对象实例,因此保证线程安全,但是可能会浪费系统资源。
示例代码:
class Singleton {
private:
Singleton() {}
static const Singleton instance;
public:
static const Singleton* getInstance() {
return &instance;
}
};
const Singleton Singleton::instance = Singleton();
如何选择合适的实现方式
饿汉式在类加载时就创建对象实例,没有线程安全问题,但可能会浪费一部分系统资源。
懒汉式只有在使用时才创建对象实例,避免了资源浪费,但是有线程不安全问题。
双检锁实现了线程安全,也避免了资源浪费。
静态变量在程序启动时就创建了对象实例,保证线程安全,但是可能会浪费系统资源。
因此,需要根据实际情况选择合适的实现方式。
总结
单例模式是一种常用的设计模式,在需要频繁创建对象、系统只需要一个实例对象、多个实例会导致状态不同步等情况下广泛使用。本文介绍了饿汉式、懒汉式、双检锁和静态变量四种实现方式,并分析了它们的优缺点,希望能够对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 单例模式的几种实现方式研究 - Python技术站