1. 程式人生 > >單例模式懶漢與餓漢

單例模式懶漢與餓漢

懶漢:在初始化類的時候,不建立唯一的例項,而是等到真正需要用到的時候才建立。必須加上同步,否則有可能依然建立多個例項。
餓漢:在初始化的時候,就建立了唯一的例項,不管是否需要用到。不需要自己加同步,一定產生唯一的例項。

懶漢程式碼
publicclassSingleton
{
// 私有的、靜態的成員儲存唯一的例項
privatestaticSingleton inst;
// 私有構造器,避免被別人建立例項
privateSingleton(){}

// 提供一個公共的、靜態的方法,獲取唯一的例項
publicstaticSingleton getInstance()
{
// 很多示例程式碼都是在方法上加同步,但是基於“最小範圍原則”,應該要用同步程式碼塊
// 這樣可以儘可能提升程式的併發效能 synchronized(Singleton.class) { // 判斷inst是否為null,如果是null則新建一個 if( inst ==null) { inst =newSingleton(); } } return inst; } }

餓漢程式碼
publicclassSingleton
{
// 私有的、靜態的成員儲存唯一的例項
// 在類被第一次使用的時候,就已經完成了載入。類的載入過程,系統保證執行緒安全。
privatestaticSingleton inst =newSingleton();
// 私有構造器,避免被別人建立例項
privateSingleton(){} // 提供一個公共的、靜態的方法,獲取唯一的例項 publicstaticSingleton getInstance() { return inst; } }


從上面兩個程式碼來看,由於懶漢模式下,每次獲取例項都需要判斷,如果使用非常頻繁的時候,這種方式效能肯定有所下降。

因此懶漢模式下,不適合使用太頻繁的物件。

餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不在改變


而在餓漢模式下,不管是否用到,都會初始化例項。
這種是我比較推薦的做法:因為不使用物件的類,就不需要單例模式!既然需要用到物件,為何不在一開始就初始化好?