單例模式寫法詳解

public class LazyUnSafeSingle {
/** 優點:懶加載啓動快,資源佔用小,使用時才實例化,無鎖。
* 缺點:非線程安全。
*/
private static LazyUnSafeSingle single = null;
private LazyUnSafeSingle (){
}
public static LazyUnSafeSingle getInstance(){
if(single == null){
single = new LazyUnSafeSingle();
}
return single;

}

public class LazySafeSingle {
/** 優點:懶加載啓動快,資源佔用小,使用時才實例化,加鎖。
* 缺點:synchronized 爲獨佔排他鎖,併發性能差。即使在創建成功以後,獲取實例仍然是串行化操作。
*/
private static LazySafeSingle single = null;
private LazySafeSingle(){

}
public static synchronized LazySafeSingle getInstance(){
if (single == null){
single = new LazySafeSingle();
}
return single;
}
}

public class LazySafeDoubleCheckLockSingle {
/** 優點:懶加載,線程安全。
* 缺點:實例必須有 volatile 關鍵字修飾,其保證初始化完全,(這裏體現的是有序性)。
*/
private volatile static LazySafeDoubleCheckLockSingle single = null;
private LazySafeDoubleCheckLockSingle(){
}
public static LazySafeDoubleCheckLockSingle getInstance(){
if(single == null){
synchronized(LazySafeDoubleCheckLockSingle.class){
if(single == null){
single = new LazySafeDoubleCheckLockSingle();
}
}
}
return single;
}
}

public class UnLazySafeSingle {
/** 優點:餓漢模式天生是線程安全的,使用時沒有延遲。
* 缺點:啓動時即創建實例,啓動慢,有可能造成資源浪費。
*/
private static UnLazySafeSingle single = new UnLazySafeSingle();
private UnLazySafeSingle(){
};
public static UnLazySafeSingle getInstance(){
return single;
}


}

public class HolderSingle {
/**
* 優點:將懶加載和線程安全完美結合的一種方式(無鎖)
* 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例,沒有綁定關係,而且只有被調用到纔會裝載,從而實現了延遲加載
*/
private HolderSingle() {}

private static class Holder{
/**
* 靜態初始化器,由JVM來保證線程安全
*/
private static HolderSingle single = new HolderSingle();

}
public static HolderSingle getInstance(){
return Holder.single;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章