单例模式
创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象,再提供访问它的一个全局访问点,即定义一个static函数,返回类中唯一构造的一个实例对象。任何条件下,保证只有一个实例对象,这就是单例。
- 线程安全:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
- 懒汉模式:在系统运行中,实例并不存在,只有当需要的时候才创建并使用实例。(需要考虑线程安全)可以使用静态局部变量(c++11及以上)或者需要加锁。
class MultiThreadSingleton
{
public:
~MultiThreadSingleton()
{
cout << "~MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* getInstance()
{
if(instance == nullptr)
{
pthread_mutex_lock(&mutex);
instance = new MultiThreadSingleton();
pthread_mutex_unlock(&mutex);
}
return instance;
}
void SingletonOP()
{
cout << "SingletonOP!" << endl;
}
private:
MultiThreadSingleton()
{
pthread_mutex_init(&mutex,NULL);
cout << "MultiThreadSingleton()" << endl;
}
static pthread_mutex_t mutex;
static MultiThreadSingleton* instance;
};
MultiThreadSingleton* MultiThreadSingleton::instance = nullptr;
pthread_mutex_t MultiThreadSingleton::mutex;
MultiThreadSingleton* sig3 = MultiThreadSingleton::getInstance();
sig3->SingletonOP();
delete sig3;
static MultiThreadSingleton* getInstance()
{
static MultiThreadSingleton localInstance;
return &localInstance;
}
MultiThreadSingleton* sig4 = MultiThreadSingleton::getInstance();
MultiThreadSingleton* sig5 = MultiThreadSingleton::getInstance();
sig4->SingletonOP();
if(sig4 == sig5) cout << "Test!" << endl;
- 饿汉模式:指系统一运行,就初始化创建实例,当需要的时候,直接调用就行。(本身就是线程安全)
- 二者的主要区别就是创建实例的时间不同
- 使用懒汉单例时,推荐使用内部静态变量的懒汉单例,代码量少。
- 懒汉式是空间换时间,适应于访问量较少;饿汉式是时间换空间,适应于访问量较大或者线程较多时。
class MultiThreadSingleton
{
public:
~MultiThreadSingleton()
{
cout << "~MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* getInstance()
{
return instance;
}
void SingletonOP()
{
cout << "SingletonOP!" << endl;
}
private:
MultiThreadSingleton()
{
cout << "MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* instance;
};
MultiThreadSingleton* MultiThreadSingleton::instance = new MultiThreadSingleton();
|