天天看點

Java單例模式1.餓漢式2.懶漢式3.雙重檢查鎖4.靜态内部類5.枚舉類

在網上看的單例模式的幾種實作,自己手寫了下例子,貼出來留着以後複習用

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

}