设计模式之-单例模式

1、单例模式的应用场景:

  (1)、方便资源相互通信的环境。比如:线程池

  (2)、封装一些常用的工具类,保证整个应用常用的数据统一

  (3)、保存一些共享数据在内存中,其他类随时可以读取。

2、单例模式实现的方式:

  (1)、饿汉式:类装载时就会完成实例化

  (2)、懒汉式:不使用的情况下不进行实例化,会按需初始化

  (3)、静态内部类:加载外部类时不会加载内部类,这样实现懒加载(其实还是懒汉式的实现)

  (4)、枚举类:使用枚举类实现单例模式(也是懒汉式的一种,并且是线程安全,并且可以反序列化)

3、各方式的实现代码:

  (1)、饿汉式:

public class Mgr01 {
    private static final  Mgr01 INSTANCE= new Mgr01();

    private Mgr01() {};

    private static  Mgr01 getInstance(){
        return INSTANCE;
    }

    public void m(){
        System.out.println("m");
    }
}

//调用时
Mgr01 m1=Mgr01.getInstance();

  (2)、懒汉式:

/**
*    使用volatile 和 synchronized 和双重检查解决线程安全问题
**/
public class Mgr03 {
    private volatile static  Mgr03 INSTANCE;

    private  void Mgr03(){};

    private static   Mgr03 getInstance(){
        if(INSTANCE == null){
            //锁优化  不是所有线程都加锁
            synchronized (Mgr03.class) {
                //双重检查
                if(INSTANCE == null) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new Mgr03();
                }
            }
        }
        return  INSTANCE;
    }

    public void m(){ System.out.println("m2");}
}

//调用时
Mgr03.getInstance();

  (3)、静态内部类

//jvm保证单例,同时也是线程安全
public class Mgr04 {

    private Mgr04(){}

    private  static  class  Mgr04Holder{
        private static  final  Mgr04 INSTANCE= new Mgr04();
    }

    public  static Mgr04 getInstance(){
        return  Mgr04Holder.INSTANCE;
    }

}
//调用时
Mgr04.getInstance();

  (4)、枚举类

public enum Mgr05 {
    INSTANCE;
}

//调用时
Mgr05.INSTANCE

——听设计模式之笔记

posted @ 2022-03-15 14:57  韩小陌  阅读(28)  评论(0编辑  收藏  举报