Java單例模式的各種寫法和最優寫法推薦
阿新 • • 發佈:2019-01-03
話不多說,直接上程式碼:
(1)
//只適合單執行緒環境,懶漢模式
class Singleton{
private static Singleton Instance = null;
public Singleton() {
}
public static Singleton getInstance(){
if(Instance==null){
Instance = new Singleton();
}
return Instance;
}
}
評價:由於只生成一個例項,為防止別人建立該類例項,構造方法為私有屬性,只有在例項物件為空時才去建立(為避免重複建立)。
//餓漢模式
class Singleton{
private static Singleton Instance = new Singleton();
public Singleton() {
}
public static Singleton getInstance(){
return Instance;
}
}
評價:開始的時候就建立一個final型別的靜態例項物件,以後不會再改變。
//雙重判斷
class Singleton{
private static Singleton Instance = null ;
public Singleton() {
}
public static Singleton getInstance(){
if(Instance==null){
synchronized (Singleton.class) {
if (Instance == null) {
Instance = new Singleton();
}
}
}
return Instance;
}
}
評價:經過兩次判定,第一次檢測到例項為空時,增加同步,同步後再次檢測到例項為空時,才建立物件例項。有效防止了在多執行緒環境下建立多個例項的問題。(4)
//volatile 關鍵字的使用
private static volatile Singleton singleton;
volatile 關鍵字的使用可以解決一定程度上的多執行緒訪問時出現的同步問題,保證一定程度的執行緒安全。如果整形的變數由volatile修飾,在其值發生改變後,
能夠快速被其他執行緒可見,告知其他執行緒自己發生改變。
(5)結合volatile的單例模式class Singleton{ private static volatile Singleton Instance=null; public Singleton() { } public static Singleton getInstance(){ if(Instance==null){ synchronized (Singleton.class) { if (Instance == null) { Instance = new Singleton(); } } } return Instance; } }評價:在volatile 和synchronized 兩端執行緒安全的保護下,保證了多執行緒訪問情況下出現多個例項的問題。volatile 保證在例項物件建立後快速通知其他執行緒
該物件的例項已經存在,不需要重複建立了。主要突出了可見性。