01 定義
單例模式:確保一個類只有一個實例帮匾,并提供一個全局訪問點圈纺。
02 線程安全下的三種實現(xiàn)方式
- 01 餓漢式
public class Singleton {
// 類加載時,就進行對象實例化。
// 缺點:類加載時就初始化酌伊,浪費內(nèi)存购城。
private static final Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
- 02 懶漢式 (不推薦)
public class Singleton {
private static Singleton singleton;
private Singleton(){}
// 添加synchronized關(guān)鍵字,確保不會有兩個線程同時進入該方法匣沼。
// 缺點:只有第一次執(zhí)行此方法時,才真正需要同步乃秀。之后每次調(diào)用此方法肛著,同步都是一種累贅,嚴重降低性能跺讯。
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
- 03 雙重檢查加鎖
public class Singleton {
// volatile關(guān)鍵字確保singleton變量被初始化成Singleton實例時,多個線程能正確的處理singleton變量殉农。
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
// 雙重檢查加鎖刀脏,這樣只有第一次才會同步。
if(singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
- 04 使用靜態(tài)內(nèi)部類
public class Singleton {
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.singleton;
}
// 靜態(tài)內(nèi)部類
private static class SingletonHolder{
private static final Singleton singleton = new Singleton();
}
}