單例模式懶漢與餓漢
阿新 • • 發佈:2019-02-19
懶漢:在初始化類的時候,不建立唯一的例項,而是等到真正需要用到的時候才建立。必須加上同步,否則有可能依然建立多個例項。
餓漢:在初始化的時候,就建立了唯一的例項,不管是否需要用到。不需要自己加同步,一定產生唯一的例項。
懶漢程式碼
餓漢程式碼
從上面兩個程式碼來看,由於懶漢模式下,每次獲取例項都需要判斷,如果使用非常頻繁的時候,這種方式效能肯定有所下降。
而在餓漢模式下,不管是否用到,都會初始化例項。
這種是我比較推薦的做法:因為不使用物件的類,就不需要單例模式!既然需要用到物件,為何不在一開始就初始化好?
餓漢:在初始化的時候,就建立了唯一的例項,不管是否需要用到。不需要自己加同步,一定產生唯一的例項。
懶漢程式碼
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; } }
從上面兩個程式碼來看,由於懶漢模式下,每次獲取例項都需要判斷,如果使用非常頻繁的時候,這種方式效能肯定有所下降。
因此懶漢模式下,不適合使用太頻繁的物件。
餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不在改變
而在餓漢模式下,不管是否用到,都會初始化例項。
這種是我比較推薦的做法:因為不使用物件的類,就不需要單例模式!既然需要用到物件,為何不在一開始就初始化好?