单例设计模式使用场景:
    统计登陆人数的计数器,获取配置文件类
    单例设计模式的特点:
    1、构造器私有
    2、在一个Java应用程序中,可保证只有一个实例对象
    3、只提供一个供外界调用的getInstance()方法
    总结:一个静态的私有成员变量、一个私有构造方法,一个公共的获取实例方法
    单例设计模式的优点:
    1、减少某些对象的频繁创建,降低系统开销和内存占用
    2、外部调用不使用new关键字,降低系统内存的使用频率
    3、对于特殊的类,在系统中只能存在一个实例,否则系统无法正常运行,比如Controller
    单例设计模式的实现:
    饿汉式:该方式在成员位置声明Singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费。

    1. /**
    2. * @Auther: mojh
    3. * @Date: 2022/05/26/11:33
    4. * @Description: 饿汉式单例模式
    5. */
    6. /*
    7. 1、静态的私用成员变量
    8. 2、私有的构造参数
    9. 3、获取实例的方法
    10. */
    11. public class HungrySingleton {
    12. private static HungrySingleton hungerySingleton = new HungrySingleton();
    13. private HungrySingleton() {}
    14. public HungrySingleton getHungerySingleton(){
    15. return hungerySingleton;
    16. }
    17. }
    1. **懒汉式**:懒汉模式中加锁的问题,对于 getInstance() 方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以我们没必让每个线程必须持有锁才能调用该方法,我们需要调整加锁的时机。由此也产生了一种新的实现模式:双重检查锁模式<br />双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。<br />要解决双重检查锁模式带来空指针异常的问题,只需要使用 volatile 关键字, volatile 关键字可以保证可见性和有序性。<br />[<br />](https://blog.csdn.net/zouliping123456/article/details/79858576)
    1. /**
    2. * @Auther: mojh
    3. * @Date: 2022/05/26/11:41
    4. * @Description: 懒汉式单例模式(双重检查锁)
    5. */
    6. public class LazySingleton {
    7. private volatile static LazySingleton lazySingleton = null;
    8. private LazySingleton(){}
    9. public LazySingleton getLazySingleton(){
    10. if (lazySingleton == null) {
    11. synchronized (LazySingleton.class) {
    12. if (lazySingleton == null) {
    13. lazySingleton = new LazySingleton();
    14. }
    15. }
    16. }
    17. return lazySingleton;
    18. }
    19. }

    参考链接:csdn链接