单例模式的3种经典实现

今天来学习单例模式,这个模式比较简单,但是应用确实挺广的,属于入门级的设计模式。

带着问题出发

  1. 什么是单例模式?
  2. 单例模式的几种实现?

单例模式介绍

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

  1. 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
  2. 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

其实概念很简单,即:「确保一个类只有一个实例,并提供全局访问点。」

实现

饿汉单例

public class Student1 
    // 2:成员变量初始化本身对象 
    private static Student1 student = new Student1(); 
    // 1:构造私有 
    rivate Student1() { }
    // 3:对外提供公共方法获取对象 
    public static Student1 getSingletonInstance() 
        return student; 
    } 
}

可以看到是依赖 JVM 在加载这个类时马上创建了此唯一实例,JVM 确保在任何线程访问 实例变量前,一定先创建此实例。适合于在创建和运行时方面不太繁重,急切需要此单件的情况。

懒汉-静态内部类

public class Student5 {
     
    private Student5() {
    }
    /**
     * 此处使用一个内部类来维护单例 JVM在类加载的时候,是互斥的,所以可以由此保证线程安全问题
     */

    private static class SingletonFactory {
        private static Student5 student = new Student5();
    }
    /* 获取实例 */
    public static Student5 getSingletonInstance() {
        return SingletonFactory.student;
    }
}

懒汉-双重检查锁

public class Student5 {
     
    /**
     * volatile 关键字确保对象初始化完成,
     * 避免出现指令重排序导致赋值不为 null,但是还未初始化的情况出现
     */

    private volatile static Student5 student5;
    private Student5() {}

    /* 获取实例 */
    public static Student5 getSingletonInstance() {
        if (student5 == null) {
            synchronized (Student5.class) {
                if (student5 == null) {
                    student5 = new Student5();
                }
            }
        }
        return student5;
    }
}

到这里我们就已经完成了单例模式的学习,相信你已经能在工作中根据场景选择不一样的实现方式,希望能为你提供帮助。


全文完,fighting!

往期设计模式系列文章点击查看:

  • 据说是程序员工作中用到的最多的模式:策略模式解析
  • 暗中等待:观察者模式解析
  • 穿了马甲你就牛逼了:装饰者模式解析
  • 工厂模式-简单工厂、工厂方法、抽象工厂解析

你可能感兴趣的:(设计模式,设计模式,java,单例模式,饿汉,懒汉)