美文网首页
Java23种设计模式之「单例模式」

Java23种设计模式之「单例模式」

作者: MrLimLee | 来源:发表于2020-07-22 16:17 被阅读0次

    单例模式 之 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() {
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Java23种设计模式之「单例模式」

          本文链接:https://www.haomeiwen.com/subject/xqltlktx.html