zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式(Singleton):保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个

    饿汉式(推荐):

    public class Singleton {
        
        // 类加载时生成实例对象,避免多线程时出问题
        // 私有方法,避免被外部类直接访问
        // 静态属性,保证实例对象可以在提供给外部类调用的方法内部使用
        private static Singleton singleton = new Singleton() ;
        
        // 构造函数必须是私有的 
        // 这样在外部便无法使用 new 来创建该类的实例 
        private Singleton(){}
        
        // 静态方法,保证外部类调用时不需要生成对象
        // 获取实例的唯一方法
        public static Singleton getInstance(){
            return singleton;
        }
    
    }

    懒汉式(适用于有些类比较庞大,延迟加载有助于提升性能。):

    public class Singleton {
        
        // 定义一个私有的静态全局变量来保存该类的唯一实例
        private static Singleton singleton;
    
        // 构造函数必须是私有的
        // 这样在外部便无法使用 new 来创建该类的实例
        private Singleton() {}
    
        // 定义一个全局访问点
        // 设置为静态方法
        // 则在类的外部便无需实例化就可以调用该方法
        public static Singleton GetInstance() {
    
            /**
             * 所以在没有第一重 singleton == null 的情况下,也是可以实现单例模式的?那么为什么需要第一重 singleton == null 呢?
             * 这里就涉及一个性能问题了,因为对于单例模式的话,new Singleton()只需要执行一次就 OK 了,
             * 而如果没有第一重 singleton == null 的话,每一次有线程进入 GetInstance()时,均会执行锁定操作来实现线程同步,
             * 这是非常耗费性能的,而如果我加上第一重 singleton == null 的话,
             * 那么就只有在第一次,也就是 singleton ==null 成立时的情况下执行一次锁定以实现线程同步,
             * 而以后的话,便只要直接返回 Singleton 实例就 OK 了而根本无需再进入 lock 语句块了,这样就可以解决由线程同步带来的性能问题了。
             */
            // 这里可以保证只实例化一次,即在第一次调用时实例化,以后调用便不会再实例化,第一重 singleton == null
            if (singleton == null) {
                
                synchronized (Singleton.class) {
                    
                    // 第二重 singleton == null
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
  • 相关阅读:
    释放jQuery 的$ 的使用权
    jQuery 入口函数主要有4种写法
    jQuery的 ready() 和原生 Js onload() 的主要区别:
    简单的单击图片循环播放
    Jsの练习-数组其他常用方法 -map() ,filter() ,every() ,some()
    Jsの练习-数组常用方法 -forEach()
    stylelint和eslint的VS插件配置
    工作中遇到的bug
    VUE关于data对象中数组修改和对象添加属性的响应式问题
    VUE的watch监听对象
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/4804894.html
Copyright © 2011-2022 走看看