- 懶漢式
public class Singleton {
private static Singleton instance;
private Singleton() {};
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
首次呼叫時進行初始化;
synchronized加鎖保證執行緒安全;
- 餓漢式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {};
public static Singleton getInstance() {
return instance;
}
}
類加載時就實體化,避免了多執行緒同步問題,不需要加鎖;
- 雙重校驗鎖(DCL, double checked locking)
public class Singleton {
private volatile static Singleton instance;
private Singleton() {};
public static Singleton getInstance() {
if (instance == null){
synchronized (Singleton.class) {
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
首次呼叫時進行初始化;
volatile關鍵字保證了變數在多執行緒下的可見性以及防止指令重排;
通過加鎖和兩次校驗是否實體化避免多執行緒多次創建實體的問題;如:
當實體未被創建時,執行緒t1呼叫getInstance方法,第一次判斷instance==null為真,繼續執行,進入同步代碼塊,在t1創建實體之前,執行緒t2也呼叫了getInstance方法,并且由于實體還未被創建,t2同樣可以通過第一個if,繼續往下執行,t1創建完實體后退出同步代碼塊,t2進入,此時,如果沒有第二個if,那么t2也會創建一個實體,但是加上第二個if,就可以避免這個多執行緒多次創建實體的問題,
- 靜態內部類
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {};
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
利用類加載機制避免多執行緒同步問題;
靜態內部類延遲了初始化,只有呼叫getInstance方法時才會加載內部類,從而實體化;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/245614.html
標籤:其他
