设计模式学习(五):单例模式 (下)

设计模式(四)单例模式 写在前边:辛辛苦苦写了好几天终于能有一篇发到首页上了,其中的艰辛就不必多说了,我不是专家不发能首页,好多文章博乐也都不看,比起首页上那些空洞无味的文章,我觉得我的博客对一部分人能起到帮助的作用,如果您觉得我写的还可以就顶一下吧,您的支持是我最大的动力!一、模式定义单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类 阅读详情

2019年12月17日

承接上文《设计模式学习(五):单例模式 (上)》,继续设计模式学习,补充“单例模式”的三种方法,分别是:双锁校验、内部类、枚举类。

目录

4、双重校验

5、内部类

6、枚举类


4、双重校验

  • volatile防止指令重排
  • synchronized对象锁解决并发问题
package design.SinglePattern;

/**
 * 双锁检验
 * 双重非空判断,new对象前加一次锁。
 * volatile关键字,考虑的是,new关键字在虚拟机中执行时其实分为很多步骤,具体原因可以参考深入理解java虚拟机一书(考虑的是这个new关键字字节码执行时是非原子性的),而volatile关键字可以防止指令重排。
 * @author moubin.mo
 * @date: 2019/12/17 16:11
 */

public class SingletonCase4 {

	/**volatile防止指令重排*/
	private static volatile SingletonCase4 singleton;

	public SingletonCase4() {
	}

	/**
	 * 只是在实例为空时才进行同步创建
	 * 为什么做了2次判断?
	 * A线程和B线程同时进入方法: getInstance()
	 * 然后都在1位置处判断了实例为null
	 * 然后都进入了同步块2中
	 * 然后A线程优先进入了同步代码块2中(B线程也进入了),然后创建了实例
	 * 此时,如果没有3处的判断,那么A线程创建实例同时,B线程也会创建一个实例
	 * 所以,还需要做2次判断
	 * */
	public static SingletonCase4 getInstance(){
		if (singleton == null){ // 1
			synchronized (SingletonCase4.class){ // 同步块2
				if (singleton == null){ // 3
					singleton = new SingletonCase4();
				}
			}
		}
		return singleton;
	}

}

 

5、内部类

  • 实现内部类的懒加载
  • 内部类的属性为静态变量的初始化,因此不存在线程安全问题
  •  调用构造方法时,外部类被加载,但这时其静态内部类其实未被加载;直到调用该内部类的静态方法时,内部类的属性才被加载。
package design.SinglePattern;

/**
 * 内部类
 * 优点:由于静态内部类跟外部类是平级的,所以外部类加载的时候不会影响内部类,因此实现了lazy loading, 同时也是利用静态变量的方式,使得INSTANCE只会在SingletonHolder加载的时候初始化一次,从而保证不会有多线程初始化的情况,因此也是线程安全的。
 * @author moubin.mo
 * @date: 2019/12/17 16:11
 */

public class SingletonCase5 {
	//静态内部类,在被用到时才加载(根据内部类不会在其外部类被加载的同时被加载的事实)
	private static class SingletonCase5Holder{
		private static final SingletonCase5 singleton = new SingletonCase5();
	}

	public SingletonCase5() {
	}

	public static SingletonCase5 getInstance(){
		return SingletonCase5Holder.singleton;
	}

}

 

6、枚举类

  • 枚举类的属性为一个懒加载的私有变量
  • 首先我们分析一下,为什么枚举类可以保证线程安全?原因是:经过反编译,枚举类内部是执行了静态代码块,和饿汉式代码有异曲同工之妙,前面我们分析了当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以,创建一个enum类型是线程安全的。
package design.SinglePattern;

/**
 * 枚举类
 * 本质就是:创建一个枚举类,封装一个对象,枚举类私有构造器中初始化对象
 * @author moubin.mo
 * @date: 2019/12/17 16:11
 */

public class SingletonCase6 {
	static enum SingletonEnum {
		//创建一个枚举对象,该对象天生为单例
		INSTANCE;
		private SingletonCase6 singleton;

		//私有化枚举的构造函数
		private SingletonEnum() {
			System.out.print("-----1-----");
			singleton = new SingletonCase6();
		}

		public SingletonCase6 getSingleton() {
			System.out.print("-----2-----");
			return singleton;
		}
	}

	private SingletonCase6() {
	}

	public static SingletonCase6 getInstance(){
		System.out.print("-----3-----");
		return SingletonEnum.INSTANCE.getSingleton();
	}

	public static void main(String[] args) {
		getInstance();
	}
}

欢迎扫二维码关注公众号,获取技术干货

 

设计模式在C#开发工控软件中的应用:单例模式 本文介绍了设计模式在工控软件开发中的应用,重点讲解了单例模式的四种实现方式:懒汉式(含线程安全改进)、饿汉式、Lazy<T>延迟加载和容器注册,并通过代码示例展示了具体实现。作者结合自身开发经验,说明了单例模式在工控软件中(如工厂模式、事件总线等场景)的实际应用价值,包括避免资源浪费和保证资源共享。文章还提供了测试验证方法和Github源码地址,后续将继续更新其他设计模式的应用案例。 阅读详情

相关推荐

k8s架构、工作流程、集群组件详解

Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。

qq_51545656的博客 4382

设计模式学习(五):单例模式及其优化示例(C语言)

一、前言 单例模式(Singleton Pattern)是最简单的设计模式之一,因此并不为其专门开一次研讨会,在闲余时间自行学习,接下来我们来看看该模式的具体内容。、 二、单例模式 单例模式即保证一个类仅有一个实例,并提供一个访问它的全局访问点 单例模式本质上就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可 以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。 由此可见,单例模式主要是用来避免 一个全局使用的类被频繁地创建与销毁 的情况,当我们想控制实例数目或者节省系统资

Rain_Mic的博客 677

目标检测 RT-DETR(2023)详细解读

在使用了这个技巧后,显然训练过程中,类别的标签不再是此前的0和1离散值,而是0~1的连续值。关于 Query Selection(查询向量选择),大家应该并不陌生,这个方法可谓在DETR领域大杀四方,如DAB-DETR对查询向量进行重构理解,将其解释为Anchor,DN-DETR通过查询降噪来应对匈牙利匹配的二义性所导致的训练时间长的问题,DINO提出从Encoder中选择Top-k特征进行学习等一系列方法,这都无疑向我们证明,查询向量很重要,选择好的Query能够让我们事半功倍。在RT-DETR中,

qq_51352130的博客 5868

设计模式学习(五):单例模式 (上)

2018年08月30日 目录 1、单例模式概念 2、饿汉模式 3、懒汉模式 1、单例模式概念 确保某一个类只有一个实例,并且自行实例化,并且向整个系统提供这个实例。 与全局变量的区别:全局变量不能实现继承,而单例模式可以; 2、饿汉模式 package designModel.SingleExampleModel; public class testSingl...

Diligence is the mother of success. 240

STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

薄膜压力传感器采集压力数据

XiaoCaiDaYong的博客 3万+

QCC305x-QCC304x系列开发教程之应用程序子系统详解 嵌入式

本文对QCC305x-QCC304x系列芯片的应用程序子系统进行了详细解析,并给出了一个LED闪烁的示例代码。嵌入式系统的开发既需要理论知识的支持,也需要实践经验的积累,希望本文能够为读者在QCC305x-QCC304x系列芯片的开发中提供一些有益的指导。QCC305x-QCC304x系列芯片提供了丰富的外设接口,包括UART、SPI、I2C等,开发者可以根据需求选择适合的接口进行数据传输和控制。QCC305x-QCC304x系列芯片的应用程序子系统是整个嵌入式系统的核心部分,负责管理和执行各种应用程序。

CodeMaven的博客 225

设计模式学习笔记之五:单例模式的多种实现及优缺点比较

单例模式确保一个类只有一个实例,并提供一个全局访问点。 在很多实际场景中,我们希望某个类只能有一个实例化的对象,例如数据连接池,日志对象等等,这个时候我们就要使用单例模式了,单例模式的核心思想是私有化构造器,防止其他类任意实例化该类,具体的实现有多种,每种都会有其优缺点,让我们来仔细看看各种实现的差异吧。 依据我写代码的习惯,先上UML类图,我用的工具是StarUML,免费不需要破解哦:) ...

weixin_30901729的博客 134

YOLOv9原创自研:卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

为了进一步提升小目标检测能力,风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 361

【设计模式学习】单例模式和工厂模式

设计模式是在软件设计中反复出现的问题和解决方案的经验总结。它是对软件设计中常见问题的通用解决方案,可以帮助设计人员更高效地解决问题,并提高软件设计的质量和可维护性。设计模式提供了一种在特定情况下的解决方案,它们可以被反复使用,并且是经过验证的最佳实践。设计模式可以帮助开发人员更好地理解软件设计中的问题,并为他们提供一种标准的方法来解决这些问题。通俗易懂的一点来说:就是提高你的下限。

xiaoxie8023的博客 3001

把云端打印带回办公室:通信场景 SAP_COM_0466 打通 SAP BTP ABAP environment 与本地打印机的 Pull Integration 实战

摘要: 本文探讨云端SAP系统如何通过SAP_COM_0466通信场景实现与本地打印机的安全连接。核心方案采用Pull Integration模式,由本地组件(如SAP Cloud Print Manager或第三方OMS)主动从云端打印队列拉取任务,避免网络边界冲突。配置流程涵盖通信安排创建、打印队列绑定及权限管理,并强调队列类型必须选择"Pull Integration Queue"的关键细节。方案通过分离云端生产与本地打印环节,既保障安全性又便于运维监控,适用于SAP BTP AB

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

【基础-单选】Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐:

Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐

江拥羡橙的博客 1304

设计模式实战教程:基于 youngyangyang04/DesignPattern 开源项目

设计模式实战教程:基于 youngyangyang04/DesignPattern 开源项目 本教程旨在全面介绍位于 GitHub 的设计模式开源项目。通过深入浅出的讲解,我们将涵盖项目的核心要素,提供快速上手指南,展示经典应用场景,以及探索其在技术生态中的位置。 1. 项目介绍 设计模式 是软件开发中的一套成熟解决方案,用于解决常见的设计问题并促进代码的可重用性、可维护性和扩展性。此开源项目 D...

gitblog_00568的博客 1057

基于 ESP32 的分布式光伏微电网智能监控系统设计与实现

设备 / 模块连接 ESP32 引脚备注I2C 总线(SDA)GPIO21所有 I2C 设备共用I2C 总线(SCL)GPIO22所有 I2C 设备共用DS18B20(单总线)GPIO18单总线通信,需外接 4.7K 上拉电阻有源蜂鸣器GPIO19低电平触发,串联 100Ω 限流电阻ESP32 供电5V/GND由 LM2596 输出 5V 供电,或直接 USB 供电(调试阶段)INA219(光伏)光伏阵列正负极接 INA219 的 VIN+/VIN-

weixin_42300449的博客 303

C++设计模式 - 单例模式

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 设计模式概念 设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取: 代码更易于维护,代码的可读性,复用性,可移植性,健壮性会更好 当软件原有需求有变更或者增加新的需求时,合理...

大秦坑王的专栏 4050

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目 项目介绍 该项目由 Github 用户 micooz 维护,是针对软件开发中常见设计模式的实现集合。它旨在提供一个学习和理解各种设计模式的实战平台,涵盖了从单例模式到观察者模式等二十多种经典设计模式。通过此仓库,开发者可以深入学习每种模式的概念、应用场景及其实现细节,助力提升代码质量和可维护性。 项目快速启动 环境要求...

gitblog_00751的博客 819

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计模式-单例模式

设计模式记录学习单例模式是java中最简单的设计模式之一,这种类型的设计模式属于创建类型的一种,它提供了创建对象的最佳方式。就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供了一个取得其对象实例的静态方法。例如Hibernate的sessionFactory 它充当数据存储源代理,并且负责创建Session对象.SessionFactory并不是轻量级,一般情况下,一个项目只需要一个SessionFactory,这时就会用到单例模式单例模式注意事项和细节说明。

qq_41217095的博客 1653

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式学习之——单例模式

设计模式学习,单例模式,最常见的设计模式之了。懒汉式、饿汉式、静态内部类、双重检测锁、枚举等。单例模式的应用场景、注意事项。面试中经常问到的关于单例模式的问题有哪些

github_38727595的博客 1554

【 设计模式学习】单例模式

在面试的过程中屡屡被问到设计模式,出现频率很高,可见设计模式的重要性,所以,学习设计模式刻不容缓!先了解一下什么是设计模式?设计模式的定义: 设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。设计模式的分类:按照目的可分为三类,创建型模式,结构型模式,行为型模式;按照范围,即模式主要处理类之

John的博客 1076

Dart设计模式之单例模式

在这里为了方便大家系统的学习Flutter,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份Flutter全家桶学习资料。内容概要:Flutter技术解析与实战、Flutter进阶学习笔记、Flutter入门与实战和Flutter完整开发实战详解。内容特点:条理清晰,含图像化表示更加易懂。由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要 Flutter技术解析与实战 完整文档的可扫描下方卡片免费获取!

大模型学习路线 1798

常见设计模式—单例模式(Singleton)

前言 好久没写东西了,但是想着无论什么事还是要坚持自己初心要坚持的东西,纵使其他事情不应该斩断,而是放慢。 对于常用的23种设计模式,这里笔者会根据自己学习和出现频率、重要程度进行学习记录吧。 单例模式 单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一...

bigsai 8196

【设计模式】| 修炼内功 | 23种设计模式——单例模式

本文分享了23种设计模式之一的单例模式,小伙伴们一起干起来叭!!!

狮子也疯狂的博客 1364

设计模式之五:单例模式

《Head First设计模式》第五章学习笔记 一、单例模式     单例模式:确保一个类只有一个实例,并提供一个全局访问点。     在java中实现单例模式,需要:私有的构造器、一个静态变量和一个静态方法。类图如下: 二、单例模式实现   实现方式一:不考虑多线程情况 public class Singleton { priv

caihaijiang的专栏 1638

设计模式之单例模式:如何有效进行程序初始化?

从这一讲开始,我们就正式进入模块三“编程模式”的学习了。 设计模式导学 不过,在这之前,我想简单和你聊聊设计模式的学习路径这个话题。这也是很多同学都很关心的话题。 设计模式的底层逻辑 关于设计模式,现在有很多同学反馈说: 学习了很多设计模式的课程和文章,依然不会用设计模式; 设计模式适用场景没有设计原则多; 设计模式入门简单,精通很难; 设计模式太复杂看不懂; 面试前才会看设计模式; 设计模式不如面向搜索编程有用; …… 不可否认,一方面大家都很重视设计模式的学习,另一方面却

舞鹤白沙编码日志 898

JavaScript 设计模式 —— 单例模式

在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 —— 设计模式 设计模式原则:“找出程序中变化的地方,并将变化封装起来”

weixin_46653793的博客 1236

设计模式之单例模式

设计模式之单例模式

weixin_61492871的博客 1352
上一篇: 后端日志【21】:时间过的很快,年末新的挑战又来了。
下一篇: Java(47):解剖 Integer 等包装类的自动装箱拆箱和jvm缓存机制
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值