创建型(二) - 单例模式

news2024/9/21 20:50:04

一、概念

单例设计模式(Singleton Design Pattern):一个类只允许创建一个对象(或者实例),那这个类就是一个单例类。

优点:在内存里只有一个实例,减少了内存的开销,避免一个全局使用的类频繁地创建与销毁。

缺点:没有接口,不能继承,与开闭职原则冲突。

使用场景:有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。

二、实现

1、步骤:

  • 构造方法定义为私有方法。
  • 定义一个私有的类静态实例。
  • 提供一个公有的获取实例的静态方法。

2、实现方式

  • 饿汉模式
public class HungryModeSingleton {
    private static final HungryModeSingleton mInstance = new HungryModeSingleton();

    private HungryModeSingleton() {}
    public static HungryModeSingleton getInstance() {
        return mInstance;
    }
}

总结:在类加载的时候就对实例进行初始化,没有线程安全问题;获取实例的静态方法没有使用同步,调用效率高;但是没有使用懒加载,如果该实例从始至终都没被使用过,则会造成内存浪费。

  • 懒汉模式
public class LazyModeSingleton {
    private static LazyModeSingleton mInstance;

    private LazyModeSingleton () {}
    public static synchronized LazyModeSingleton getInstance() {
        if (mInstance == null){
            mInstance = new LazyModeSingleton();
        }
        return mInstance;
    }
}

总结:上面是线程安全的懒汉模式,在第一次使用的时候才进行初始化,达到了懒加载的效果;但是,这种写法每次获取实例都要进行同步(加锁),因此在频繁获取对象的时候效率较低。

  • 双检锁/双重校验锁(DCL,即 double-checked locking)
 public class DCLModeSingleton {
    private static volatile DCLModeSingleton mInstance;

    private DCLModeSingleton () {}
    public static synchronized DCLModeSingleton getInstance() {
        if (mInstance == null){
            synchronized (DCLModeSingleton.class){
               if (mInstance == null){
                   mInstance = new DCLModeSingleton();
              }
           }
       } 
       return mInstance;      
   }
}      

总结:双重校验锁方式在第一次使用的时候才进行初始化,达到了懒加载的效果。并且只有第一次进行初始化才进行同步,因此不会有效率方面的问题。

在上面的例子中,DCLModeSingleton的实例使用了volatile关键字进行修饰,主要是为了解决在一些JDK低版本上有指令重排的问题。
指令重排问题:当线程A执行到9行的时候,线程B执行到6行,CPU在进行对象创建的时候,内部会在保证不影响最终结果的前提下对指令进行重新排序(不影响最终结果只是针对单线程)。例如:
创建对象步骤:分配空间-> 初始化对象 ->设置mInstance指向。
指令重排后:分配空间-> 设置mInstance指向 ->初始化对象
此时线程B执行到第6行,发现mInstance不为空,但是对象并没有初始化完成,会出现问题,但是概率较低。
使用volatile修饰符可以禁止指令重排,防止出现该问题。

  • 静态内部类
public class StaticModeSingleton {
    private StaticModeSingleton () {}

    private static class SingletonHolder{
        private static final StaticModeSingleton INSTANCE = new StaticModeSingleton();
    }
    public static StaticModeSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

总结:SingletonHolder 是一个静态内部类,当外部类StaticModeSingleton被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建instanceinstance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。

  • 枚举
public enum Singleton {
    INSTANCE;
    //添加自己需要的操作
    public void doSomeThing() {
    }
}

总结:非懒加载,线程安全,可以避免反序列化重新创建对象。

3、实现方式优缺点对比
设计模式优缺点.PNG

三、应用场景

  • 网站计数器。
  • 应用程序的日志应用。
  • Web项目中的配置对象的读取。
  • 数据库连接池。
  • 多线程池。

单例模式详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/909313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMwar安装Centos7保姆级教程

下载文件 首先我们先下载Centos7的官方镜像和VM虚拟机软件 下面是百度云盘的下载链接 链接:https://pan.baidu.com/s/1aF55_F9IK4pFB45d5vHBmg?pwd87vc 提取码:87vc –来自百度网盘超级会员V1的分享 安装虚拟机 首先我们先把VMware16.1.0.rar文件解压…

PDF怎么转成PPT文件免费?一个软件解决

随着科技的不断发展和进步,电子文档已经成为我们日常工作和学习中不可或缺的一部分。PDF作为一种跨平台的文件格式,以其可靠性和易读性而备受推崇。然而,在某些情况下,我们可能需要PDF怎么转成PPT文件免费,以便更好地展…

Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果

1. 前言 上文 我们在Windows电脑上实现了人脸功能,接下来我们要把人脸识别的功能移植到Android上。 那么首先第一步,就是要创建一个Native的Android项目,并且配置好OpenGL,并能够调用成功。 这里我们使用的是openCV-4.8.0&#x…

【HCIP】生成树--STP

一、STP 1.产生背景 在星状拓扑或者树形拓扑中,当某个设备或者某条链路出现故障,就会导致数据不能正常转发,出现单点故障的问题。 为了防止出现单点故障,一般需要环形拓扑来保证链路的冗余性,当某条链路出现故障&…

基于Jenkins构建生产CICD环境-------从小白到大神之路之学习运维第84天

第四阶段 时 间:2023年8月21日 参加人:全班人员 内 容: 基于Jenkins构建生产CICD环境 目录 一、环境概述 二、Jenkins简介 (一)Jenkins 包含以下几个特点: (二)持续集成 …

Matlab使用

Matlab使用 界面介绍 新建脚本:实际上就是新建一个新建后缀为.m的文件 新建编辑器:ctrlN 打开:打开最近文件,以找到最近写过的文件 点击路径,切换当前文件夹 预设:定制习惯用的界面 常见简单指令 ;…

S05-巧用单元格格式转换数据

视频教程 文章目录 S05-巧用单元格格式转换数据 S05-巧用单元格格式转换数据 格式类型默认格式(常规)转换格式数值1.21.200货币1.2¥1.20会计专用1.2¥1.20日期43567四月十二日时间0.3333333338:00 AM百分比1.2120.00%分数0.21/5科…

云养猪平台如何开发

随着数字化和智能化的发展,农业行业也逐渐开始融入互联网技术,其中云养猪平台作为新兴的农业数字化解决方案之一,备受关注。本文将探讨如何开发一款具备专业、思考深度和逻辑性的云养猪平台。 一、前期准备阶段: 1.明确目…

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测 目录 分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 结合1D时序-2D图像多模态融合的CNN-GRU故障识别算法,基于一维时序信号和二维图…

k8s之nodes

概念: Node是Kubernetes中的工作节点,最开始被称为minion。一个Node可以是VM或物理机。每个Node(节点)具有运行pod的一些必要服务,并由Master组件进行管理,Node节点上的服务包括Docker、kubelet和kube-pro…

派森 #P126. 维吉尼亚加密

描述 维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定字符的替换关系。 如上图为维吉尼亚密码的加密过程示意,左边为加密替换表,上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:‪‬…

在飞腾麒麟linux上编译安装tcpdump小结

1 从:【免费】在麒麟Linux下编译所需要的四个源文件资源-CSDN文库,https://download.csdn.net/download/dijkstar/88236907下载几个源文件: 2 按照上面文件列表的顺序解压、编译、安装: (注意:操作之前&am…

贴片电阻的额定功率

1、不同封装电阻的额定功率不同 通常是越大的封装,额定功率越大,常见的封装和功率对应如下表: 封装 功率 0402 62.5mW 0603 100mW 0805 125mW 1206 250mW 1210 500mW 2、关于额定功率和环境温度 额定功率:在额定环境…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(三)(属性填充之循环依赖底层原理解析)

目录 前置知识循环依赖的产生Spring里面的3个Map 课程内容一、只有一级缓存的推理演进1.1 直接将实例化后生成的对象放入到单例池里面1.1 引入一个中间Map存实例化后的早期对象(疑似二级缓存)1.3 解决1.2需要被代理的问题(疑似二级缓存&#…

鸿蒙应用开发学习路线(OpenHarmony/HarmonyOS)

鸿蒙应用开发学习路线(OpenHarmony/HarmonyOS) HarmonyOS应用开发学习路线网站汇总社区汇总视频学习路线 OpenHarmony应用开发学习路线与资料网站汇总社区汇总学习路线 MarkDown工具推荐 HarmonyOS应用开发学习路线 作者:坚果 团队&#xff1…

gremlin安装使用 详细步骤

gremlin是一个图数据库查询工具,注意他只是一个工具类似于dbeaver,navicat,sqlyog,是专门来分析图数据库的一个工具。 下载 下载地址Apache Download Mirrors 省事的可以直接 wget https://www.apache.org/dyn/closer.lua/tin…

LC-平衡二叉树

LC-平衡二叉树 链接:https://leetcode.cn/problems/balanced-binary-tree/description/ 描述:给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的…

电容笔哪个厂家的产品比较好?开学值得买电容笔推荐

开学快要到来了,各位学生党又开始为开学而准备,而电容笔对于学生党来说是必备的数码产品。苹果的正版Pencil,由于价格很贵,仅仅一支的售价就要近千块钱,所以很多人都买不起。现在国内的平板电脑电容笔已经很完美了&…

FreeCAD傻瓜式教程之约束设定和构建实体、开孔、调整颜色等

本内容基于官方教程中的绘制简单的零件中的体会,在初次绘制的时候,总是无法完成,几经尝试才发现其关键点所在,以此文记录,用以被查资料,同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…