1.单例模式

张开发
2026/4/6 2:51:25 15 分钟阅读

分享文章

1.单例模式
1.单例模式软件系统设计中整个系统在大多数情况下只需要一个全局对象。创建类的实例化对象必然要申请内存、消耗资源。可想而知如果系统进行多个实例对象的创建消耗的资源必然也会加倍。因此单例模式考虑的是在只需要一个全局对象的时候就不创建第二个实例化对象不再进行重复的构造和析构节省资源开销。2.单例模式分为饿汉式和懒汉式两种。饿汉式是线程安全的不用加锁。懒汉式不是线程安全的要加锁。3.C实现饿汉式线程安全不加锁/////////////////////饿汉式/////////////////////#includeiostreamusingnamespacestd;classPerson{public:staticPerson*getPerson(){staticPerson person;returnperson;}private:// 私有构造防止类外直接实例化Person(){coutperson...endl;}};intmain(){Person*p1Person::getPerson();Person*p2Person::getPerson();// 以下四个内存地址都相同说明这些对象是唯一的实例也就是单例coutp1::p1endl;coutp2::p2endl;printf(p1::%p\n,p1);printf(p2::%p\n,p2);getchar();return0;}4.C实现懒汉式线程不安全要加锁///////////////////// 线程安全 懒汉式 /////////////////////#includeiostream#includemutex// 加锁必须的头文件usingnamespacestd;classPerson{public:// 懒汉式 双重检查锁定 加锁线程安全staticPerson*getPerson(){// 第一次检查不加锁提高效率不为空就不进代码块if(!instance){// 加锁保证同时只有一个线程能进入lock_guardmutexlock(mtx);// 第二次检查防止多线程重复创建if(!instance){instancenewPerson();}}returninstance;}private:// 私有构造Person(){coutperson...endl;}// 静态成员变量staticPerson*instance;staticmutex mtx;// 锁 也必须是静态的1.static函数只能用static成员2.单例全局唯一锁也必须全局唯一};// 类外初始化静态变量Person*Person::instancenullptr;mutex Person::mtx;intmain(){Person*p1Person::getPerson();Person*p2Person::getPerson();coutp1::p1endl;coutp2::p2endl;printf(p1::%p\n,p1);printf(p2::%p\n,p2);getchar();return0;}

更多文章