生活中很多東西都是獨一無二的, 比如每個人都是唯一的, 不可能有第二個自己; 電腦中的任務管理器只能開啟乙個, 那就是單例, 而qq能開啟多個, 那就是多例. 反映在程式設計裡, 單例就是乙個類只允許產生乙個物件, 不允許建立多個物件!
說起單例模式, 不得不提到: 「餓漢式單例」 和 「懶漢式單例」, 所謂"餓漢"就是程式一執行就迫不及待地產生唯一的物件, 而"懶漢"正好相反, 程式執行起來時不急著建立物件, 直到外界來問它要物件的時候, 才開始建立. 兩者各有各的好處, 下面我們乙個個分析
/**
* @author cqf
*/public
class
singleton
//產生乙個物件
private
static singleton singleton =
newsingleton()
;//對外暴露乙個獲取例項的靜態方法
public
static singleton getinstance()
}class
singletontest
}
執行結果:確實是同乙個物件
//宣告乙個物件,但不初始化
private
static singleton singleton = null;
//對外暴露乙個獲取例項的靜態方法
public
static singleton getinstance()
else}}
class
singletontest
}執行結果:
餓漢式單例在一開始就建立物件, 在程式剛開始執行時可能慢一點, 但是後來再拿物件速度就很快了, spring容器用的也是這種策略; 因為一開始就建立了, 不確定是否用得到這個物件, 如果用不到的話, 會產生資源浪費, 另外它天生是執行緒安全的, 因為一開始就建立物件的話, 執行緒不會誤操作. 那麼懶漢式的優缺點真好反過來
有沒有辦法把兩者的優點集中起來, 並拋棄掉缺點(取其精華, 去其糟粕)? 當然有!那就是懶漢式靜態內部類單例
話不多說, 上**:
/**
* @author cqf
*/public
class
singleton
}//靜態內部類
private
static
final
class
innersingletonclass
//對外暴露乙個獲取例項的靜態方法
public
static singleton getinstance()
}class
singletontest
}
利用靜態內部類巧妙地節省了資源又保證了執行緒安全; 原因是靜態內部類預設不載入, 所以節省了資源, 至於執行緒安全問題, 那是由虛擬機器保證的:
虛擬機會保證乙個類的clinit()方法在多執行緒環境中被正確的加鎖、同步,如果多個執行緒同時去初始化乙個類,那麼只會有乙個執行緒去執行這個類的clinit()方法,其他執行緒都需要阻塞等待,直到活動執行緒執行clinit()方法完畢。需要注意的是,其他執行緒雖然會被阻塞,但如果執行clinit()方法的那條執行緒退出clinit()方法後,其他執行緒喚醒後不會再次進入clinit()方法. --《深入理解jvm》
了解單例設計模式
餓漢式單例 singleton類裡面會始終維持乙個instance 的例項化物件,然而並不關心這個物件是否被使用。package com.gen 單例設計類 class singleton public static singleton getinstance 測試類 客戶端 public clas...
了解23種設計模式之單例模式
一,什麼是單例模式?單例模式是一種物件建立型模式,使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。其實,gof gang of four,代表意思是 設計模式一書,四個作者,被稱為四人組 對單例模式的定義是 保證乙個類,只有乙個例項存在,同事提...
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...