创建型设计模式-单例设计模式和应用

创建型设计模式-单例设计模式和应用

单例设计模式

  • 单例设计模式:

    • 单例的意思只包含一个对象被称为但是的特殊类
    • 通过单例设计模式可以保证系统种,应用该模式的类只有一个对象实例
  • 使用场景:

    • 业务系统全局只需要一个对象实例,比如发号器。redis链接对象等
    • Spring IOC容器中的bean默认就是单例
    • Spring boot 中的controller、service、dao层中通过@Autowire的依赖注入对象默认都是单例模式
  • 分类:

    • 懒汉:所谓的懒加载,延迟创建对象。
    • 饿汉:与懒汉相反,提前创建对象
  • 实现步骤

    • 私有化构造方法
    • 提供获取单例的方法

单例设计模式中的懒汉式实现方法

  • 单例设计模式-懒汉式的几种实现方法
package Java设计模式.创建型设计模式.单例设计模式;

import java1031.LazySingleton;

/**
 * @Author: ruan
 * Date: 2021/11/17 14:29
 * @Description: 单例,懒汉式
 */
public class SingletonLazy {
    private static SingletonLazy instance;
    /**
     * 私有化构造方法
     */
    private SingletonLazy(){};

    /**
     * 测试方法
     */
    public void process(){
        System.out.println("方法调用成功");
    }

    /**
     * 第一种方法
     * 对外暴漏一个获取实例的方法(多线程下存在安全问题)
     */
    /*public static SingletonLazy getInstance(){
        if (instance == null){
            instance = new SingletonLazy();
        }
        return instance;
    }*/

    /**
     * 第二种方法
     * 通过synchronized加锁保证单例
     * 采用synchronized对方法加锁有很大的性能开销
     * 解决方法:降低锁粒度
     * @return
     */
    public synchronized static SingletonLazy getInstance(){
        if (instance == null){
            instance = new SingletonLazy();
        }
        return instance;
    }
}

单例模式中的懒汉式实现+双重检查锁定+内存模型

  • 改进实现方法
 /**
     * 第三种方法
     * DCL双重检查锁定(Double-Checked-Locking),多线程情况下保证高性能
     * 是否安全?
     * instance = new SingletonLazy()并不是原子性操作?
     * 1、分配空间给对象
     * 2、在空间内创建对象
     * 3、对象赋值给引用
     * 所以要加上volatile关键字,防止指令重排序
     * @return
     */
     private static volatile SingletonLazy instance;
    public static SingletonLazy getInstance(){
        //第一重检查
        if (instance == null){
            //线程锁定
            synchronized (LazySingleton.class){
                //第二重检查
                if (instance == null){
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

单例模式中的饿汉式实现方法

  • 饿汉方式:提前创建好对象
  • 优点:实现简单,没有多线程同步问题
  • 缺点:不过有无使用,instance对象一直占着内存
  • 如何选择:
    • 如果对象不大,且创建不复杂,之间使用饿汉式
    • 其他情况使用懒汉式
package Java设计模式.创建型设计模式.单例设计模式;

/**
 * @Author: ruan
 * Date: 2021/11/17 15:12
 * @Description: 单例设计模式-饿汉式
 */
public class SingletonHungry {
    private static SingletonHungry instance = new SingletonHungry();
    private SingletonHungry (){};
    public static SingletonHungry getInstance(){
        return instance;
    }
}

JDK源码里面的单例设计模式

  • JDK中Runtime类 饿汉方式
    创建型设计模式-单例设计模式和应用_第1张图片

  • JDK中Desktop类 懒汉方式
    创建型设计模式-单例设计模式和应用_第2张图片

你可能感兴趣的:(设计模式,jvm,java,设计模式)