懒汉式:
懒汉式是指,在第一次获取这个类的实例的时候才new这个对象。即可以延迟加载该对象实例。
懒汉式单例设计模式在多线程同时初始化实例的时候有线程安全问题, 解决的方案是,加同步锁,使用同步方法和同步代码块都能解决问题。 然而多线程每次都访问锁,导致效率低下,所以使用同步代码块,然后以双重判断的形式来解决每次都判断同步锁导致的效率低下问题。
1 class singleton 2 { 3 protected: 4 singleton() 5 { 6 pthread_mutex_init(&mutex); 7 } 8 private: 9 static singleton* p; 10 public: 11 static pthread_mutex_t mutex; 12 static singleton* initance(); 13 }; 14 15 pthread_mutex_t singleton::mutex; 16 singleton* singleton::p = NULL; 17 singleton* singleton::initance() 18 { 19 if (p == NULL) 20 { 21 pthread_mutex_lock(&mutex); 22 if (p == NULL) 23 p = new singleton(); 24 pthread_mutex_unlock(&mutex); 25 } 26 return p; 27 }
饿汉式:
饿汉式是指,在类加载的时候即new出该类对象。
饿汉式单例模式在类加载时就创建了单例对象,它是线程安全的。
1 class singleton 2 { 3 protected: 4 singleton() 5 {} 6 private: 7 static singleton* p; 8 public: 9 static singleton* initance(); 10 }; 11 singleton* singleton::p = new singleton; 12 singleton* singleton::initance() 13 { 14 return p; 15 }