公司网站标题优化,重庆有什么好玩的地方,哈尔滨seo优化排名,深圳高端网站建设创新单例模式
最简单也是被问到最多的设计模式之一#xff0c;保证一个类只创建一个实例#xff0c;同时提供全局访问的方法。
懒汉模式
在使用这个实例对象时才去创建#xff0c;创建对象时加锁保证有且仅有一个#xff08;有线程安全问题#xff09;
实现方式 静态局部变…单例模式
最简单也是被问到最多的设计模式之一保证一个类只创建一个实例同时提供全局访问的方法。
懒汉模式
在使用这个实例对象时才去创建创建对象时加锁保证有且仅有一个有线程安全问题
实现方式 静态局部变量 互斥锁 使用C11新特性call_once
经典的线程安全例子
class single{
private://私有静态指针变量指向唯一实例static single *p;//静态锁是由于静态函数只能访问静态成员static pthread_mutex_t lock;//私有化构造函数single(){pthread_mutex_init(lock, NULL);}~single(){}public://公有静态方法获取实例static single* getinstance();};pthread_mutex_t single::lock;single* single::p NULL;
single* single::getinstance(){if (NULL p){pthread_mutex_lock(lock);if (NULL p){p new single;}pthread_mutex_unlock(lock);}return p;
}为什么要用双检测只检测一次不行吗
如果只检测一次在每次调用获取实例的方法时都需要加锁这将严重影响程序性能。双层检测可以有效避免这种情况仅在第一次创建单例的时候加锁其他时候都不再符合NULL p的情况直接返回已创建好的实例。
局部静态变量之线程安全懒汉模式
class single{
private:single(){}~single(){}public:static single* getinstance();};single* single::getinstance(){static single obj;return obj;
}这种方法不加锁会不会造成线程安全问题
C0X以后要求编译器保证内部静态变量的线程安全性。
饿汉模式
不管是否使用这个实例对象只要类被创建出来实例对象就被创建无线程安全问题
饿汉模式不需要用锁就可以实现线程安全。原因在于在程序运行时就定义了对象并对其初始化。之后不管哪个线程调用成员函数getinstance()都只不过是返回一个对象的指针而已。所以是线程安全的不需要在获取实例的成员函数中加锁。
class single{
private:static single* p;single(){}~single(){}public:static single* getinstance();};
single* single::p new single();
single* single::getinstance(){return p;
}//测试方法
int main(){single *p1 single::getinstance();single *p2 single::getinstance();if (p1 p2)cout same endl;system(pause);return 0;
}饿汉模式存在隐藏的问题在于非静态对象函数外的static对象在不同编译单元中的初始化顺序是未定义的。如果在初始化完成之前调用 getInstance() 方法会返回一个未定义的实例。