首页 > 其他分享 >单例模式

单例模式

时间:2022-11-04 20:35:05浏览次数:56  
标签:private 实例 static 模式 单例 线程 public

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。

一、单例模式的特点

  1. 单例类只能有一个实例。
  2. 单例类必须自己传教自己的唯一实例
  3. 单例类必须给所有其他对象提供这一实例

单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性


二、实现单例模式的六种方式

  1. 饿汉式---静态常量
    public class HungrySingleton {
        // 2.创建类内静态属性为该类对象,并使用final和private进行修饰,避免其能够修改
        private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton();
    
        // 1.将构造方法私有
        private HungrySingleton() {
    
        }
        // 3.将这一个单例使用静态方法返回到调用者手中
        public static HungrySingleton getInstance() {
            return HUNGRY_SINGLETON;
        }
    }
    
    • 优点:写法简单,在类装载的时候就完成了实例化,避免了线程同步问题。
    • 缺点:如果从始至终未使用过这个实例,会造成内存的浪费。没有懒加载的效果
  2. 饿汉式---静态代码块
    public class StaticCodeBlockSingleton {
        private static final StaticCodeBlockSingleton STATIC_CODE_BLOCK_SINGLETON;
        static {
            STATIC_CODE_BLOCK_SINGLETON = new StaticCodeBlockSingleton();
        }
        private StaticCodeBlockSingleton() {
    
        }
        public static StaticCodeBlockSingleton getInstance() {
            return STATIC_CODE_BLOCK_SINGLETON;
        }
    }
    

    这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。

  3. 饿汉式---枚举类
    public enum EnumSingleton {
        //枚举元素本身就是单例
        SINGLETON;
    
        //添加自己需要的操作
        public void singletonOperation(){
        }
    }
    
    • 线程安全,调用效率高,可以天然的防止反射和反序列化调用。
    • 不能延时加载,没有懒加载的效果
  4. 懒汉式---同步方法,线程安全
    public class LazySingleton {
        private static LazySingleton lazySingleton = null;
    
        //保证无法通过构造器进行外部实例化
        private LazySingleton() {
    
        }
    
        public static synchronized LazySingleton getInstance() {
            if (lazySingleton == null) {
                lazySingleton = new LazySingleton();
            }
            return lazySingleton;
        }
    }
    
    • 优点:该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance ()方法时才去开辟内存空间,创建这个单例,线程安全。
    • 缺点:高并发的情况下,每次访问getlnstance ()方法都要同步,会影响性能,且消耗更多的资源。
  5. 懒汉式---同步代码块,双重检查
    public class DoubleCheckLockSingleton {
        private static DoubleCheckLockSingleton dclSingleton = null;
    
        private DoubleCheckLockSingleton() {
    
        }
    
        public static DoubleCheckLockSingleton getInstance() {
            //最外层检查是为了效率,后续线程进来发现该类实例已经创建,直接获取
            if (dclSingleton == null) {
                synchronized (DoubleCheckLockSingleton.class) {
                    if (dclSingleton == null) {
                        dclSingleton = new DoubleCheckLockSingleton();
                    }
                }
            }
            return dclSingleton;
        }
    }
    
    • 优点:线程安全;延迟加载;效率较高。

    如代码中所示,我们进行了两次if (dclSingleton == null)检查,这样,同步代码块中的实例化代码只用执行一次,后面再次访问时,判断if (dclSingleton == null),直接return实例化对象。

  6. 懒汉式---静态内部类
    public class StaticInnerClassSingleton {
        private StaticInnerClassSingleton() {
        }
    
        public static StaticInnerClassSingleton getInstance() {
            return SingletonClassInstance.INSTANCE;
        }
    
        private static class SingletonClassInstance{
            private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
        }
    }
    
    • 优点:静态内部类方式在StaticInnerClassSingleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance()方法,才会装载SingletonClassInstance静态内部类,从而完成StaticInnerClassSingleton的实例化。线程安全,调用效率高,可以延时加载。
    • 缺点:不能保证反序列化的对象是单例。

标签:private,实例,static,模式,单例,线程,public
From: https://www.cnblogs.com/qiu-rong/p/16859015.html

相关文章

  • 【设计模式】中介者模式(行为设计模式)
    对于中介者,任谁一听都想到了房产中介,然而房产中介的职责和这个中介者模式的职责很类似,就是在买房和卖房之间建立一个桥梁通讯(当然了,我们这个不收费O(∩_∩)O)中介者模式的......
  • java8 函数式编程实现策略模式
    代码如下: /***java8函数式编程实现策略模式**@date2022/11/4*/publicclassFunctionStrategy{privatestaticMap<String,Function<String,Str......
  • EasyCVR国标GB28181协议接入下的TCP和UDP模式说明及差异
    有用户在使用我们的平台时,经常会出现对于端口的疑问,同时也不了解端口的差别。今天我们来解释说明下EasyCVR平台关于国标GB28181协议接入下的TCP和UDP模式的说明及差异。......
  • 深入理解sed模式空间——sed 'n;p'
    在进入正题之前我们先来了解一下sed的模式空间,如下什么是sed的模式空间?答(仅供参考):就是从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式......
  • 软件设计-装饰模式
    手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音......
  • 软件设计-组合模式
    组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。 类图  java  packagerjsj.no10;publicclassClient{publicstaticvoidmain(St......
  • 软件设计-桥接模式
    两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。 类图  java  packagerjsj.no9;publicclassCar......
  • 软件设计-外观模式
    计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Har......
  • 软件设计-职责链模式
    财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审......
  • 软件设计-代理模式
    婚介所婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。 ......