Java23种设计模式之创建型模式「单例模式」

单例模式 之 holder 模式 (推荐)

/**
 * 单例模式 之 holder 模式
 *   带有 Holder 的方法,
 *   类级内部类,静态的成员内部类,该内部类的实例与外部类的实例没有绑定关系
 *   只有在调用的时候才会被封装,从而实现了延迟加载,即懒汉式
 *
 *   holder方式的单例模式是最好的设计之一,也是目前用的比价广泛的设计之一
 *
 * 优点:
 *   将懒加载和线程安全完美结合的一种方式(无锁)
 *
 * 缺点:
 *
 * 注:
 *   final 修饰,不允许被继承
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfHolder {

    private static class SingletonModeOfHolderIn {

        /**
         * 静态初始化,由JVM来保证线程安全
         */
        public static final SingletonModeOfHolder INSTANCE =
                new SingletonModeOfHolder();
    }

    public static SingletonModeOfHolder getInstance() {
        return SingletonModeOfHolderIn.INSTANCE;
    }

    public SingletonModeOfHolder() { }
}

单例模式 之 饱汉模式(懒汉模式)

/**
 * 单例模式 之 饱汉模式(懒汉模式)
 *
 * 优点:
 *   启动快,资源占用小,使用时才实例,无锁
 *
 * 缺点:
 *   非线程安全的,多线程下不能保证单例的唯一性
 *
 * 注:
 *   final 修饰,不允许被继承
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFull {

    private static SingletonModeOfFull instance = null;

    public SingletonModeOfFull getInstance () {
        if (instance == null) {
            instance = new SingletonModeOfFull();
        }
        return instance;
    }

    public SingletonModeOfFull() {}
}

单例模式 之 双重锁检查 (Double Check Lock)

/**
 * 单例模式 之 饱汉模式(懒汉模式) 线程安全 双重锁检查 (Double Check Lock)
 *
 * 优点:
 *   懒加载,线程安全
 *
 * 缺点:
 *
 * 注:
 *   实例必须有 volatile 关键字修饰,保证初始化完全,保证了变量的可见性(visibility)
 *   被 volatile 关键字修饰的变量,如果值发生了变化,其他线程立马可见
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFullDCL {

    private volatile static SingletonModeOfFullDCL instance = null;

    public static SingletonModeOfFullDCL getInstance() {

        // 判断实例是否存在,如果不存在进入下面的同步块
        if (instance == null) {

            // 同步 线程安全的创建实例
            synchronized (SingletonModeOfFullDCL.class) {

                // 再次检查实例是否存在
                if (instance == null) {
                    instance = new SingletonModeOfFullDCL();
                }
            }
        }
        return instance;
    }

    public SingletonModeOfFullDCL() {}
}

单例模式 之 饱汉模式(懒汉模式) 线程安全

/**
 * 单例模式 之 饱汉模式(懒汉模式) 线程安全
 *
 * 优点:
 *   启动快,资源占用小,使用时才实例,有锁
 *
 * 缺点:
 *   synchronized 为独占排他锁,并发性差,即使在创建成功之后,获取实例仍然是串行化操作
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfFullSafe {

    private static SingletonModeOfFullSafe instance = null;

    public static synchronized SingletonModeOfFullSafe getInstance() {
        if (instance == null) {
            instance = new SingletonModeOfFullSafe();
        }
        return instance;
    }

    public SingletonModeOfFullSafe() {}
}

单例模式 之 饿汉模式

/**
 * 单例模式 之 饿汉模式
 *
 * 优点:
 *   饿汉模式天生是线程安全的,使用时没有延迟
 *
 * 缺点:
 *   时候即创建实例,启动慢,有可能造成资源浪费
 *
 * @author Mr.Lim
 */
public final class SingletonModeOfHungry {

    /**
     * 类加载即创建对象
     */
    private final static SingletonModeOfHungry INSTANCE = new SingletonModeOfHungry();

    /**
     * 提供给外接获取对象的方法
     */
    public static SingletonModeOfHungry getInstance() {
        return INSTANCE;
    }

    /**
     * 私有化构造器 防止外接创建对象
     */
    private SingletonModeOfHungry() {

    }

}
posted @ 2020-07-22 16:22  Mr-Lim  阅读(206)  评论(0编辑  收藏  举报