懶漢式:
懶漢式是指,在第一次獲取這個類的實例的時候才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 }