• 设计模式之单例模式


    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

    ——听设计模式之笔记

  • 相关阅读:
    java正则表达式
    SpringAOP03 项目脚手架、自定义注解、织入切面、引介增强
    SpringAOP02 自定义注解
    servlet01 项目demo、servlet生命周期
    SpringBoot15 sell02 订单模块
    SpringBoot15 sell01 项目创建、MySQL数据库连接、日志配置、开发热部署、商品信息模块
    datatables01 安装、数据源、选中行事件、新增一行数据、删除一行数据
    Navicat 连接阿里云的 MySQL
    linux内核中ip,tcp等头的定义(转)
    TCPflow:在Linux中分析和调试网络流量的利器(转)
  • 原文地址:https://www.cnblogs.com/hxd9588/p/16008455.html
Copyright © 2020-2023  润新知