餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不在改變
懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的。
從實現方式來講他們最大的區別就是懶漢式是延時載入,
他是在需要的時候才建立物件,而餓漢式在虛擬機器啟動的時候就會建立,
餓漢式無需關注多執行緒問題、寫法簡單明瞭、能用則用。但是它是載入類時建立例項(上面有個朋友寫錯了)、所以如果是乙個工廠模式、快取了很多例項、那麼就得考慮效率問題,因為這個類一載入則把所有例項不管用不用一塊建立。
懶漢式的優點是延時載入、缺點是應該用同步(想改進的話現在還是不可能,比如double-check)、其實也可以不用同步、看你的需求了,多建立一兩個無引用的廢物件其實也沒什麼大不了。
1、靜態成員例項的懶漢模式:
class singleton
public:
static singleton* getinstance();
};singleton* singleton::getinstance()
unlock();
}return m_instance; }
2、內部靜態例項的懶漢模式
這裡需要注意的是,c++0x以後,要求編譯器保證內部靜態變數的執行緒安全性,可以不加鎖。但c++ 0x以前,仍需要加鎖
class singletoninside
public:
static singletoninside* getinstance()
};二、餓漢模式:即無論是否呼叫該類的例項,在程式開始時就會產生乙個該類的例項,並在以後僅返回此例項。
由靜態初始化例項保證其執行緒安全性,why?因為靜態例項初始化在程式開始時進入主函式之前就由主線程以單執行緒方式完成了初始化,不必擔心多執行緒問題。
故在效能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。
class singletonstatic
public:
static const singletonstatic* getinstance()
};//外部初始化 before invoke main
const singletonstatic* singletonstatic::m_instance = new singletonstatic;
C 單例模式
include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...
C 單例模式
實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...
C 單例模式
效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...