一、java设计模式之单例设计模式(创建型设计模式)

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

单例设计模式:

  • 这个是最简单的设计模式,所以拎出来第一个讲, 但事实却不是。
  • 单例意思只包含一个对象被称为单例的特殊类
  • 通过单例模式可以保证系统中,应用该模式的类只有一个对象实例

使用场景:

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

分类: 

  • 懒汉:就是所谓的懒加载,延迟创建对象
  • 饿汉:与懒汉相反,提前创建对象 

实现步骤:

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

一、单例设计模式中的懒汉方式实战

单例设计模式中的懒汉方式实战+双重检查锁定

package net.xdclass.single;

/**
 * 单列设计模式
 * 懒汉模式
 */
public class SingletonLzay {
    private static SingletonLzay instance;


    public void process(){
        System.out.println("单列设计模式-懒汉");
    }

    /**
     * 构造函数私有化
     */
    private SingletonLzay() {
    }



    public static  SingletonLzay getInstance3(){
        if (instance == null){
            synchronized(SingletonLzay.class){
              if (instance == null){
                  instance  = new SingletonLzay();
              }
            }

        }
        return instance;
    }




}

此方法是绝大多数人的用法,但是该方法依然存在问题

instance  = new SingletonLzay();并不是原子性操作
*  1.分配空间给对象
*  2.在空间内创建对象
*  3.将对象赋值给引用instance
假如线程1>3>2顺序,会把值写入主内存,其他线程就会读取到instance最新值,但是这个是不完全的对象(指令重排)

改进方案

volatile  java提供的关键字,可以禁止指令重排运行效果如下 

  


二、单例设计模式中的饿汉方式实战

饿汉方式:提前创建好对象

  • 优点:实现简单,没有多线程同步问题

  • 缺点:不管有没使用,instance对象一直占着这段内存

  • 如何选择:

    • 如果对象不大,且创建不复杂,直接用饿汉的方式即可
    • 其他情况则采用懒汉实现方式


/**
 * 饿汉模式
 */
public class SingletonHungry {
    private static SingletonHungry instance = new SingletonHungry();

    private SingletonHungry(){

    }

    public static SingletonHungry getInsyance(){
        return instance;
    }

    public void process(){
        System.out.println("饿汉模式-方法调用成功");
    }


}

 运行结果如下


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

  • JDK中Runtime类 饿汉方式

JDK中Desktop类 懒汉方式


版权声明:本文为qq_58345908原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。