博客
关于我
设计模式之——单例模式(一)
阅读量:651 次
发布时间:2019-03-15

本文共 1140 字,大约阅读时间需要 3 分钟。

设计模式之——单例模式

单例模式的6种写法

在 面向对象 的程序设计中,单例模式是一种常用的设计模式. 它确保一个类在程序中只有一个实例,从而减少资源浪费,提高效率. 以下是单例模式的6种主要实现方式:

  • 饿汉模式
  • 饿汉模式的特点是在类加载的时候就进行实例化. 这种方式在类加载过程中就已经预先创建了实例,虽然在首次获取对象时反应稍慢,但一次获取对象的速度会更快. 优点是无需额外的线程同步,避免了多线程环境下的同步问题. 缺点是在内存占用较大的情况下可能会有浪费资源.

    1. 懒汉模式(线程不安全)
    2. 懒汉模式的特点是在第一次调用 getInstance() 方法时才进行实例化. 这样可以在第一次实际需要对象的时候才进行初始化,省去了不必要的资源消耗. 优点是资源利用率高. 缺点是在多线程环境下存在竞态条件,可能导致线程安全问题.

      1. 懒汉模式(线程安全)
      2. 为了解决多线程环境下的线程安全问题,懒汉模式可以使用线程同步机制. 通过在 getInstance() 方法外面加上 synchronized 关键字,可以保证单个线程在获取实例的同时,其他线程无法进行实例化操作. 这样可以保证单例对象的 thread-safety. 但是这种方式会导致每次获取单例对象都要进行同步,可能会影响性能.

        1. 双重检查模式(DCL)
        2. 双重检查模式结合了懒汉模式和线程安全机制. 它在 getInstance() 方法中使用两次 if 语句来检查单例对象是否存在. 第一次检查是在不带同步的代码块中进行的,进行了优化,避免了不必要的同步. 第二次检查是在同步的代码块中进行的,确保只有在单例对象不存在的情况下才会进行实例化. 这种方式在高并发环境下性能较好,资源利用率高. 不过,由于 volatile 关键字的使用可能会带来一些性能上的开销.

          1. 静态内部类单例模式
          2. 这种模式通过使用静态内部类来存储单例对象. 在第一次调用 getInstance() 方法时,外部类的加载机制会初始化静态内部类,并且只会初始化一次单例对象. 这样可以避免在高并发环境下的同步问题,同时确保单例对象的唯一性. 该模式的优点是既保证了懒 loading 的特性,又确保了 thread-safety.

            1. 枚举单例
            2. 枚举单例是一种非常简洁的实现方式. 通过在枚举类中定义一个唯一的单例 constant,确保了类内只有一个实例. 这种方式可以避免多线程同步的问题,同时还可以避免一些资源浪费. 但这种方式只能适用于枚举类型的单例对象.

              单例模式的使用场景

              单例模式的使用场景非常广泛,主要包括以下情况:

              • 所有项目都需要一个共享访问点或共享数据的场景
              • 需要在创建对象时消耗大量资源(如 I/O、数据库等)的场景
              • 工具类对象的创建场景

    转载地址:http://gwvmz.baihongyu.com/

    你可能感兴趣的文章
    16 python基础-恺撒密码
    查看>>
    Frame--Api框架
    查看>>
    Boostrap技能点整理之【网格系统】
    查看>>
    javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
    查看>>
    ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
    查看>>
    Git简单理解与使用
    查看>>
    echarts 基本图表开发小结
    查看>>
    adb通过USB或wifi连接手机
    查看>>
    JDK9-15新特性
    查看>>
    TreeSet、TreeMap
    查看>>
    JVM内存模型
    查看>>
    可变长度参数
    查看>>
    3、条件查询
    查看>>
    cordova打包apk更改图标
    查看>>
    GitHub上传时,项目在已有文档时直接push出现错误解决方案
    查看>>
    文件系统的层次结构
    查看>>
    vue(渐进式前端框架)
    查看>>
    权值初始化和与损失函数
    查看>>
    vscode设置eslint保存文件时自动修复eslint错误
    查看>>
    Remove Extra one 维护前缀最大最小值
    查看>>