单例模式的作用
确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式通常用于需要全局访问点的情况,比如日志记录器,配置管理,数据库连接...。可以通过单例模式,可以避免多个实例的创建的占用过多系统资源,同时也可以确保数据的一致性和避免多线程环境下的竞态条件
一.饿汉机制
饿汉模式是一种单例模式的实现,在程序启动时就创建并初始化单例对象,而不是在需要时再进行延迟加载,这样可以确保在程序运行过程中始终只有一个实例对象
#include <iostream>
using namespace std;
class Signal
{
static Signal obj; //饿汉机制 !!!很重要 只是声明说明有一个静态成员
Signal(void )
{
}
//拷贝函数
Signal( Signal&that )
{}
public:
//获取静态成员
static Signal& getInstance(void)
{
return obj;
}
};
Signal Signal::obj;// 在这里创建并初始化单例对象
int main()
{
Signal &s1=Signal::getInstance();
Signal &s2=Signal::getInstance();
cout<<&s1<<" "<<&s2<<endl;
//Signal s1; 构造函数是私有的 ERROR
}
二.懒汉模式
这个词也很形象,大家可以想象为很懒,实例在调用的时候才开始创建
#include <iostream>
using namespace std;
class Signal
{
static Signal * obj; //懒汉机制
Signal(void )
{}
Signal( Signal& that )
{}
public:
static Signal& getInstance(void)
{
if(NULL==obj)
{
//创建了一个实例
obj=new Signal; //加锁改进
}
return *obj;
}
};
Signal *Signal::obj;//声明了一个指针变量
int main()
{
Signal &s1=Signal::getInstance();
Signal &s2=Signal::getInstance();
cout<<&s1<<" "<<&s2<<endl; //共用同一块地址
// Signal s1; // 构造函数是私有的 ERROR
}
懒汉改进:多线程
#include <iostream>
#include <pthread.h>
using namespace std;
class Signal
{
static Signal * obj; //懒汉机制
Signal(void )
{
cout<<"构造"<<endl;
}
Signal( Signal& that )
{}
public:
static Signal& getInstance(void)
{
if(NULL==obj)
{
obj=new Signal; //加锁改进
}
return *obj;
}
};
Signal *Signal::obj;
void *run(void *arg)
{
Signal &s=Signal::getInstance();
return NULL;
}
int main()
{
// Signal &s1=Signal::getInstance();
// Signal &s2=Signal::getInstance();
// cout<<&s1<<" "<<&s2<<endl; //共用同一块地址
// // Signal s1; // 构造函数是私有的 ERROR
for(int i=0;i<100;i++)
{
pthread_t tid;
pthread_create(&tid,NULL,run,NULL);
}
return 0;
}