单例模式:保证类的实例化对象仅有一个,并且提供一个访问他的全局访问点。
应用场景:
实现方式:
单例模式可以通过全局或者静态变量的形式实现,这样比较简单,但是这样会影响封装性,难以保证别的代码不会对全局变量造成影响。
不安全的实现方式:
原因:考虑当两个线程同时调用 getInstance 方法,并且同时检测到 instance 是 NULL,两个线程会同时实例化对象,不符合单例模式的要求。
C++
class Singleton{
private:
static Singleton * instance;
Singleton(){}
Singleton(const Singleton& tmp){}
Singleton& operator=(const Singleton& tmp){}
public:
static Singleton* getInstance(){
if(instance == NULL){
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
分类:
线程安全的懒汉模式实现:
方法:加锁
存在的问题:每次判断实例对象是否为空,都要被锁定,如果是多线程的话,就会造成大量线程阻塞。
C++
class Singleton{
private:
static pthread_mutex_t mutex;
static Singleton * instence;
Singleton(){
pthread_mutex_init(&mutex, NULL);
}
Singleton(const Singleton& tmp){}
Singleton& operator=(const Singleton& tmp){}
public:
static Singleton* getInstence(){
pthread_mutex_lock(&mutex);
if(instence == NULL){
instence = new Singleton();
}
pthread_mutex_unlock(&mutex);
return instence;
}
};
Singleton* Singleton::instence = NULL;
pthread_mutex_t Singleton::mutex;
方法:内部静态变量,在全局访问点 getInstance 中定义静态实例。
C++
class Singleton{
private:
static pthread_mutex_t mutex;
Singleton(){
pthread_mutex_init(&mutex, NULL);
}
Singleton(const Singleton& temp){}
Singleton& operator=(const Singleton& temp){}
public:
static Singleton* getInstence(){
static Singleton instence;
return &instence;
}
};
pthread_mutex_t Singleton::mutex;
饿汉模式的实现:
饿汉模式本身就是线程安全的不用加锁。
C++
class Singleton{
private:
static Singleton* instence;
Singleton(const Singleton& temp){}
Singleton& operator=(const Singleton& temp){}
protected:
Singleton(){}
public:
static Singleton* getInstence(){
return instence;
}
};
Singleton* Singleton::instence = new Singleton();
阅读量:21
点赞量:1
收藏量:0