单例模式含义】
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。 单例模式 只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等
单例模式实现方式(双重锁机制)
1.生成对象的接口屏蔽 //构造函数 拷贝构造函数
2.类中提供一个接口来生成唯一的对象
1.返回值 类对象的指针或者引用
2.接口是静态
单线程中
Singleton* getInstance()
{
if (instance == NULL)
instance = new Singleton();
return instance;
}
这样就可以了,保证只取得了一个实例。但是在多线程的环境下因为很可能两个线程同时运行到if (instance == NULL)导致可能会产生两个实例。于是就要在代码中加锁。
Singleton* getInstance() { lock(); if (instance == NULL) { instance = new Singleton(); } unlock(); return instance; }
但这样写的话,因为每次判断是否为空都需要被锁定,如果有很多线程的话,就爱会造成大量线程的阻塞。于是大神们又想出了双重锁定。
Singleton* getInstance() { if (instance == NULL) { lock(); if (instance == NULL) { instance = new Singleton(); } unlock(); } return instance; }
这样就确保不会重复创建了。两个锁确定了只有一个可以运行
class Singleton
{
public:
static Singleton* getInstance()
{
if (psing == NULL)
{
psing = new Singleton();
}
return psing;
}
private:
Singleton(){}
Singleton(const Singleton&);
static Singleton* psing;
};
Singleton* Singleton::psing = NULL;
int main()
{
Singleton* ps1 = Singleton::getInstance();
Singleton* ps2 = Singleton::getInstance();
Singleton* ps3 = Singleton::getInstance();
Singleton* ps4 = Singleton::getInstance();
return 0;
}