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;
}
}