单例模式

单例模式(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;
    }
}
原文地址:https://www.cnblogs.com/Jtianlin/p/4804894.html