单例模式

  • 懒汉模式:在使用时候才创建出对象

 在多线程时,会出现安全问题 

 

 class Test{

 2   public3       static Test* getInstance{
 4         if(m_test==NULL){
 5             m_test=new Test();    
 6         }          
 7          return m_test;
 8     }
 9 private:
10 //静态变量在使用之前必须初始化
11     static Test* m_test;
12     Test(){};
13     Test(const Test& t){};
14 }  
15 Test* Test::m_test=NULL;//初始化   

 

 

 

 

 /**加锁的第一种方式,效率低,多线程会线性进行**/

1 class Test{ 2 public3 static Test* getInstance{ mutex.lock(); 4 if(m_test==NULL){ 5 m_test=new Test(); 6 } mutex.unlock(); 7 return m_test; 8 } 9 private: 10 //静态变量在使用之前必须初始化 11 static Test* m_test; 12 Test(){}; 13 Test(const Test& t){}; 14 } 15 Test* Test::m_test=NULL;//初始化
//加锁的第二种方式,多线程只有第一次会线性运行
class Test{
publicstatic Test* getInstance{
        if(m_test==NULL){
            mutex.lock();
             if(m_test==NULL){
                 m_test=new Test();    
             } 
            mutex.unlock();      
        }        
        return m_test;
     }
 private:
 //静态变量在使用之前必须初始化
     static Test* m_test;
    Test(){};
     Test(const Test& t){};
 }  
 Test* Test::m_test=NULL;//初始化 
//c++11才能使用
class Test{
publicstatic Test* getInstance();
 private:
    Test();
    Test(const Test& t);
 } 
//静态变量相当于全局变量,另一个线程在这里时就不会再创建这个静态变量了 Test::Test
* getInstance(){ static Test* test; return &test; }

 

  • 饿汉模式:在使用之前就被创建了
  •  class Test{
    
     2   public3       static Test* getInstance(){          
     7          return m_test;
     8     }
     9 private:
    10 //静态变量在使用之前必须初始化
    11     static Test* m_test;
    12     Test(){};
    13     Test(const Test& t){};
    14 }  
    15 Test* Test::m_test=new Test();//初始化   

     

posted @ 2024-05-08 14:48  iu本u  阅读(14)  评论(0)    收藏  举报