三、懶漢式應用例項
四、雙重檢查(推薦使用)
五、靜態內部類(推薦使用)
六、列舉(推薦使用)
所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法(靜態方法)。單例模式有八種方式:比如hibernate的sessionfactory,它充當資料儲存源的**,並負責建立session物件。sessionfactory並不是輕量級的,一般情況下,乙個專案通常只需要乙個sessionfactory就夠,這是就會使用到單例模式。
餓漢式(靜態常量)
步驟如下:
構造器私有化 (防止 new )
類的內部建立物件
向外暴露乙個靜態的公共方法(getinstance)
**實現
public
class
singletontest01
}//餓漢式(靜態變數)
class
singleton
;//本類內部建立物件例項
private
static singleton instance =
newsingleton()
;//獲取本類內部物件例項
public
static singleton getinstance()
}
輸出結果:
true優缺點說明:
優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。
缺點: 在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。
這種方式基於classloder機制避免了多執行緒的同步問題,不過instance在類裝載時就例項化,在單例模式中大多數都是呼叫getinstance方法,但是導致類裝載的原因有很多種,因此不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化instance就沒有達到lazy loading的效果
結論:這種單例模式可用,可能造成記憶體浪費
餓漢式(靜態**塊)
//餓漢式(靜態**塊)
class
singleton
;//本類內部建立物件例項
private
static singleton instance;
//在靜態**塊中,建立單例物件
static
//獲取本類內部物件例項
public
static singleton getinstance()
}
這種方式和上面的方式其實類似,只不過將類例項化的過程放在了靜態**塊中,也是在類裝載的時候,就執行靜態**塊中的**,初始化類的例項。優缺點和上面是一樣的。
懶漢式(執行緒不安全,不推薦使用)
//懶漢式(執行緒不安全)
class
singleton
;private
static singleton instance;
//提供乙個靜態的公有方法,當使用到該方法時,才去建立instance
//即懶漢式
public
static singleton getinstance()
return instance;
}}
優缺點說明:
起到了lazy loading的效果,但是只能在單執行緒下使用。
如果在多執行緒下,乙個執行緒進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。
結論:在實際開發中,不要使用這種方式。
懶漢式(執行緒安全,同步方法,也不推薦)
//懶漢式(執行緒安全,同步方法)
class
singleton
;private
static singleton instance;
//提供乙個靜態的公有方法,加入同步處理的**,解決執行緒安全問題
//即懶漢式
public
static
synchronized singleton getinstance()
return instance;
}}
優缺點說明:
解決了執行緒不安全問題
效率太低了,每個執行緒在想獲得類的例項時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。方法進行同步效率太低
//雙重檢查
class
singleton
;private
static singleton instance;
//提供乙個靜態的公有方法,加入雙重檢查**,解決執行緒安全問題,同時解決懶載入問題
public
static singleton getinstance()
}}return instance;
}}
優缺點說明:
double check概念是多執行緒開發中常使用到的,如**中所示,我們進行了兩次if (singleton == nul)檢查,這樣就可以保證執行緒安全了。
這樣,例項化**只用執行一一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件,也避免的反覆進行方法同步.
執行緒安全,延遲載入,效率較高
//靜態內部類
class
singleton
;//宣告乙個靜態內部類singletoninstance(在singleton被載入時,不會載入靜態內部類singletoninstance)
private
static
class
singletoninstance
public
static singleton getinstance()
}
優缺點說明:
這種方式採用了類裝載的機制來保證初始化例項時只有乙個執行緒。
靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法, 才會裝載singletoninstance類,從而完成singleton的例項化。
類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。
優點:避免了執行緒不安全,利用靜態內部類特點實現延遲載入,效率高
結論:推薦使用
public
class
singletontest08
}//使用列舉實現單例
enum singleton
}
優缺點說明:
這借助jdk1.5中新增的列舉來實現單例模式。不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件。
這種方式是effective j**a作者josh bloch提倡的方式
結論:推薦使用
單例模式實現(七種)
單例模式確保乙個類只有乙個例項,並提供乙個全域性訪問點,實現單例模式的方法是私有化建構函式,通過getinstance 方法例項化物件,並返回這個例項 保證在jvm中只有乙個例項 優點 1 單例類只有乙個例項 2 共享資源,全域性使用 3 節省建立時間,提高效能 public class singl...
單例模式的七種寫法
第一種 懶漢,執行緒不安全 public class singleton public static singleton getinstance return instance 第二種 懶漢,執行緒安全 public class singleton public static synchronize...
七種單例模式的寫法
餓漢式 特點 在類載入時例項化,執行緒安全,如果沒有使用instance的話比較耗費資源 class singletondemo public static singletondemo getinstance 懶漢式 非執行緒安全 特點 使用時再例項化 class singletondemo pub...