我是靠谱客的博主 繁荣羽毛,最近开发中收集的这篇文章主要介绍创建型设计模式-单例设计模式和应用创建型设计模式-单例设计模式和应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

单例设计模式

  • 单例设计模式:

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

    • 业务系统全局只需要一个对象实例,比如发号器。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类 饿汉方式
    在这里插入图片描述

  • JDK中Desktop类 懒汉方式
    在这里插入图片描述

最后

以上就是繁荣羽毛为你收集整理的创建型设计模式-单例设计模式和应用创建型设计模式-单例设计模式和应用的全部内容,希望文章能够帮你解决创建型设计模式-单例设计模式和应用创建型设计模式-单例设计模式和应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部