1. 单例模式
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点
2. 应用场景
-
资源共享:当多个对象需要共享同一个资源时,可以使用单例模式来保证只有一个对象拥有该资源,避免资源冲突。
-
对象的唯一性:有些对象在系统中只能存在一个实例,例如日志记录器、数据库连接池等。使用单例模式可以确保全局只有一个实例存在,方便统一管理和访问。
-
惰性初始化:某些对象的创建和初始化过程比较复杂,需要耗费较多的时间和资源。使用单例模式可以延迟对象的创建和初始化,只有在第一次使用时才进行,提高了系统的性能和效率。
-
控制对象的访问权限:通过单例模式,可以对对象的访问进行控制,只允许特定的对象访问,提高了系统的安全性。
上述应用场景通过gpt生成的:chatgpt
兄弟们如果有gpt使用路子欢迎分享一下
3. 实现方法
- 将默认构造函数设置为私有,防止其他对象使用单例类的new运算符;
- 如果在类中显式定义了一个带参数的构造函数,默认的无参构造函数不会被隐式生成;
- 新建一个静态构建方法作为构造函数,该函数调用私有构造函数来创建对象,保存在一个静态成员变量中,此后所有对于该函数的调用都返回这一缓存的对象;
- 通过锁来保证在线程安全性;
4. 线程安全实现单例模式
#ifndef __Singleton_H
#define __Singleton_H
#include <string>
#include <mutex>
class Singleton {
public:
Singleton(Singleton& other) = delete;
Singleton& operator=(Singleton& other) = delete;
static Singleton* getInstance(const std::string& value);
std::string getValue() const { return value; }
private:
Singleton(const std::string value) : value(value) {};
~Singleton() {};
static Singleton* singleton;
static std::mutex mutex;
std::string value;
};
Singleton* Singleton::singleton = nullptr;
std::mutex Singleton::mutex;
Singleton* Singleton::getInstance(const std::string& value) {
if (singleton == nullptr) { // 减少获取锁的次数,提高性能和效率
std::lock_guard<std::mutex> lock(mutex);
if (singleton == nullptr) {
singleton = new Singleton(value);
}
}
return singleton;
}
#endif
#include <iostream>
#include <thread>
#include <chrono>
#include "Singleton.h"
void threadOOO() {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
Singleton* singleton = Singleton::getInstance("OOO");
std::cout << singleton->getValue() << "\n";
}
void threadXXX() {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
Singleton* singleton = Singleton::getInstance("XXX");
std::cout << singleton->getValue() << "\n";
}
int main() {
std::thread t1(threadOOO);
std::thread t2(threadXXX);
t1.join();
t2.join();
return 0;
}