在網上看的單例模式的幾種實作,自己手寫了下例子,貼出來留着以後複習用
1.餓漢式
/**
* @CopyRight: 版權所有
* @Description: 餓漢式的特點:線程安全,調用效率高,但是不能延時加載
* @Date: Created in 2019/8/26 11:54
*/
public class HungryManSingleton {
/**
* 單例模式需要滿足的三個條件
* 構造函數私有化;
* 自行建立唯一執行個體,并向使用者公布傳回該執行個體的接口;
* 定義一個唯一對象。
*/
/**
* 執行個體化這個類
*/
private static final HungryManSingleton INSTANCE = new HungryManSingleton();
/**
* 私有構造方法
*/
private HungryManSingleton() {
}
/**
* 對外提供公開靜态方法傳回唯一執行個體
*
* @return 執行個體對象
*/
public static HungryManSingleton getIntance() {
return INSTANCE;
}
}
2.懶漢式
/**
* @CopyRight: 版權所有
* @Description: 懶漢式的特點:線程安全,調用效率不高,但是能延時加載;
* @Date: Created in 2019/8/26 12:18
*/
public class SluggardSingleton {
/**
* 類初始化時,不初始化這個對象(懶加載真正用的時候采取加載)
*/
private static SluggardSingleton instance;
/**
* 私有構造函數
*/
private SluggardSingleton() {
}
/**
* 建立靜态方法讓外部可以擷取執行個體
* 方法同步調用效率低
*
* @return 執行個體
*/
public static synchronized SluggardSingleton getInstance() {
if (instance == null) {
instance = new SluggardSingleton();
}
return instance;
}
}
3.雙重檢查鎖
/**
* @CopyRight: 版權所有
* @Description: Double CheckLock也就是雙重鎖判斷機制(由于JVM底層模型原因,偶爾會出問題,不建議使用),是在懶漢式單例上發展而來
* @Date: Created in 2019/8/26 12:29
*/
public class DoubleCheckLockSingleton {
/**
* volatile:作用其它線程可見,當instance改變其它線程可以立即看見,不用去等鎖釋放增加了效率
* 類初始化時,不初始化這個對象(懶加載真正用的時候采取加載)
*/
private static volatile DoubleCheckLockSingleton instance;
/**
* 私有構造函數
*/
private DoubleCheckLockSingleton() {
}
/**
* 靜态方法
* 雙重鎖判斷機制
*
* @return .
*/
public static DoubleCheckLockSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckLockSingleton.class) {
if (instance == null) {
instance = new DoubleCheckLockSingleton();
}
}
}
return instance;
}
}
4.靜态内部類
/**
* @CopyRight: 版權所有
* @Description: 靜态内部類,靜态内部類模式的特點:線程安全,調用效率高,可以延時加載;
* @Date: Created in 2019/8/26 12:39
*/
public class StaticInnerClassSingleton {
/**
* 靜态内部類
*/
private static class InnerClass {
private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
/**
* 私有構造函數
*/
private StaticInnerClassSingleton() {
}
/**
* 靜态方法
*
* @return .
*/
public static StaticInnerClassSingleton getInstance() {
return InnerClass.INSTANCE;
}
}
5.枚舉類
/**
* @CopyRight: 版權所有
* @Description: 枚舉類,枚舉類特點:線程安全,調用效率高,不能延時加載,可以天然的防止反射和反序列化調用;
* @Date: Created in 2019/8/26 13:30
*/
public class EnumSingleton {
/**
* 單例對象占用資源少,不需要延時加載時:枚舉好于餓漢 ;
* 單例對象占用資源多,需要延時加載時:靜态内部類 好于 懶漢式。
*/
/**
* 枚舉
*/
private enum Singleton {
INSTANCE;
private EnumSingleton instance;
public EnumSingleton getInstance() {
return instance;
}
private Singleton() {
instance = new EnumSingleton();
}
}
/**
* 私有構造函數
*/
private EnumSingleton() {
}
/**
* 靜态方法
*
* @return .
*/
public static EnumSingleton getInstance() {
return Singleton.INSTANCE.getInstance();
}
}