单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例
懒汉模式:懒汉模式是第一次用到类的时候才会去实例化
//
// Created by yanpan on 2018/9/30.
// 实现单例模式
#if 1
#include <iostream>
#include <pthread.h>
using namespace std;
class Singleton
{
public:
static pthread_mutex_t mutex;
volatile static Singleton* getsingleton()//加上volatile关键字
{
if(project == NULL)
{
pthread_mutex_lock(&mutex);//互斥锁 保证原子操作 多线程安全
if(project == NULL) //双重检测
{
project = new Singleton();
}
pthread_mutex_unlock(&mutex);
}
return project;
}
static void release() //释放资源
{
if(project!=NULL)
{
cout<<"delete"<<endl;
delete project;
project = NULL;
}
}
private:
Singleton(){cout<<"Singleton()"<<endl;}
volatile static Singleton *project;
};
pthread_mutex_t Singleton::mutex;
volatile Singleton *Singleton::project = NULL;
int main()
{
volatile Singleton *sing1 = Singleton::getsingleton();//一个类只创建一个实例
volatile Singleton *sing2 = Singleton::getsingleton();
sing1->release();
sing2->release();
return 0;
}
#endif
饿汉模式:饿汉模式是在类定义的时候就实例化
//
// Created by yanpan on 2018/9/30.
// 实现单例模式
#if 1
#include <iostream>
#include <pthread.h>
using namespace std;
class Singleton
{
public:
static pthread_mutex_t mutex;
volatile static Singleton* getsingleton()//加上volatile关键字
{
// if(project == NULL)
// {
// pthread_mutex_lock(&mutex);//互斥锁 保证原子操作 多线程安全
// if(project == NULL) //双重检测
// {
// project = new Singleton();
// }
// pthread_mutex_unlock(&mutex);
// }
return project;
}
static void release() //释放资源
{
if(project!=NULL)
{
cout<<"delete"<<endl;
delete project;
project = NULL;
}
}
private:
Singleton(){cout<<"Singleton()"<<endl;}
volatile static Singleton *project;
};
pthread_mutex_t Singleton::mutex;
volatile Singleton *Singleton::project = new Singleton();
int main()
{
volatile Singleton *sing1 = Singleton::getsingleton();//一个类只创建一个实例
volatile Singleton *sing2 = Singleton::getsingleton();
sing1->release();
sing2->release();
return 0;
}
#endif
两个模式的特点与选择要点
- 由于是进行线程同步,在访问量大的时候选择饿汉模式,可以实现更好的性能,这是以空间换时间
- 同上,在访问量小的时候可以选择懒汉模式,以时间换取空间
博客如有不足之处,请各路大神不吝赐教 评论告知~