单列
#include <mutex>
static DataBaseMagr *self = NULL;
static std::once_flag onceFlag;
std::call_once(onceFlag, [&]
{
if (!self) {
self = new DataBaseMagr();
}
});
return self;
//线程加锁
class SingleLazy
{
private:
static SingleLazy *instance;
static pthread_once_t once;
SingleLazy()
{
cout <<"SingleLazy" <<endl;
}
static void init()
{
cout << "init"<<endl;
instance = new SingleLazy;
}
//防拷贝
SingleLazy(const SingleLazy&)=delete ;
SingleLazy& operator=(const SingleLazy&)=delete ;
public:
static SingleLazy *getInstance()
{
pthread_once(&once, init); //只执行一次
return instance;
}
};
SingleLazy * SingleLazy::instance = NULL;
pthread_once_t SingleLazy::once = PTHREAD_ONCE_INIT;
//饿汉模式线程安全
class SingleHungry
{
public:
static SingleHungry *getinstance()
{
return instance;
}
private:
//防拷贝
SingleHungry(const SingleHungry&)=delete;
SingleHungry& operator=(const SingleHungry&)=delete;
SingleHungry()
{
cout << "SingleHungry"<<endl;
}
static SingleHungry *instance;
};
SingleHungry * SingleHungry::instance = new SingleHungry;
void fun1()
{
SingleLazy *ins1 = SingleLazy::getInstance();
SingleLazy *ins2 = SingleLazy::getInstance();
if(ins1 == ins2)
{
cout <<"ins1 == ins2" <<endl;
cout <<"ins1:" <<ins1<<endl;
cout <<"ins2:" <<ins2<<endl;
}
SingleHungry *h = SingleHungry::getinstance();
SingleHungry *h1 = SingleHungry::getinstance();
cout <<"h:" <<h<<endl;
cout <<"h1:" <<h1<<endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
fun1();
return a.exec();
}