单例模式之饿汉式,懒汉式,最牛逼单例模式,枚举,注册登记式及反序列化如何保证单例

单例模式(饿汉模式、懒汉模式、DCL单例模式、枚举) 饿汉模式、懒汉模式、DCL单例模式、枚举;不同情况下使用不同的单例创建模式 立即下载

单例模式:单例模式是什么?有啥用?什么时候用?为什么要用?怎样用?(先来一波素质五连)

是什么?

单例模式?字面上理解,单:一个,例:实例,也就是我们所说的对象

有啥用?

是为了资源的重复利用,只需要赋值或者初始化一次,大家就都能重复使用

什么时候用?为什么要用?(只有一份的如日历,只需要一份的如IOC容器)

Listener 监听器,Calender 日历类,IOC容器类,配置信息Config(一搬是单例)这些都是单例的

怎样用?(这个一句话说不了,容我细细道来)

下面我将用饿汉式,懒汉式,最牛逼单例模式,枚举,注册登记式,反序列化如何保证单例 等单例模式的运用形式进行详细说明

 

  1. 饿汉式(有处明显错误导致无法实现单例,答案暗藏在后文中)

什么叫饿汉式?我的理解就是,饿了就迫不及待想吃,看下面第9行代码,声明为

private static final:说明类加载时就初始化就初始化对象,然后静态的,所以对象一直保存,直到程序停止

缺点:自然就是无论你用不用这个对象,在加载这个类的时候他都给你初始化了,都会占用空间,直到程序停止

优点:很明显,因为它在类被加载时就初始化,所以不存在对象创建时的并发问题,也就是不存在线程安全问题,可以保证单例,而且效率也算不错,因为当创建对象时需要的那几纳秒省了

建议应用场景:如果某个类的对象只需要一份,并且使用非常频繁,可以使用这种模式

 

  1. 懒汉式(明说了,答案就在下图)

什么是懒汉式?我的理解就是,懒人特点了解下,什么事情都不急着提前准备,需要用时才去准备

我们可以看到,懒汉模式下的对象,我们可以在需要时再调用方法得到,并且能保证单例(能保证?)下面就来在优缺点里继续分析

优点:避免了内存的浪费,需要对象时才获得,而且非高并发时基本能保证单例

缺点:很明显,上面都说了非高并发时能保证单例,那么高并发时不能保证一定单例, 怎样解决呢,在方法前面加个synchronized关键字(如果对性能要求不高的话可加,毕竟同步锁要等待,不懂的可以去了解下同步锁synchronized)

  1. 既然上面或多或少都有缺点,下面再来个懒汉式改进版(也就是标题的最牛逼版,请不要叫我标题档...)

优点:兼顾了饿汉模式的内存占用问题与synchronized的性能问题(性能我有测试,创建200W个对象速度跟饿汉模式基本没区别),测试代码就不贴了,自己动手试试

缺点:欢迎留言

  1. 枚举类型

enum类型只加载一次所以单例

  1. 注册登记式

简单模拟spring中ioc容器(用于存放与管理对象)

只列举了取对象时的部分代码,并且没有考虑线程安全问题,有兴趣的可以下载spring源码去瞧瞧,代码简单就不多解释

6.如何保证序列化前与反序列化后对象一致

如下可以看到我测试类中,序列化前与反序列化后两个对象不一样

那么,如何保证序列化前与反序列化后对象相等呢?

加入如下方法

然后同样代码进行测试

其实也就是深复制浅复制的区别,不懂深复制浅复制的请看后面 原型模式 那篇

如果能看到这里也是真不容易了,老铁

欢迎提问,欢迎纠错,可以转载,但请注明本文链接

mtk-drm commit送显流程(二):内核态atomic_commit实现解析 本文深入解析了mtk-drm框架中atomic_commit机制的内核态实现流程,详细介绍了从用户态触发到硬件提交的完整调用链,包括状态检查、硬件提交等关键阶段。特别分析了MTK平台在动态刷新率、内存带宽优化等方面的特有实现策略,为开发者提供了调试技巧和常见问题解决方案。 阅读详情

相关推荐

【项目实战-MATLAB】:基于机器学习的虹膜识别系统设计

虹膜识别主要包括虹膜定位、虹膜裁剪、极坐标变换、归一化、HOG特征提取、虹膜识别六个主要步骤。本系统采用MATLAB作为开发工具实现 主要算法:霍夫变换预处理 HOG特征提取 SVM进行识别

qq_45047246的博客 6537

常用的五种单例模式实现方式

单例模式的关键点 1)构造方法不对外开放,为private 2)确保单例类只有一个对象,尤其是多线程模式下 3)通过静态方法或枚举返回单例对象 4)确保单例类在反序列化是不会重新创建新的对象 单例模式的实现方式 1)饿汉式 public class Singleton1 { /* * 饿汉式是在声明的时候就已经初始化Singleton1,确保了对象...

AlbenXie的博客 315

模型参考自适应控制(MRAC):让PID参数动态优化

本文深入解析模型参考自适应控制(MRAC)技术,它通过实时调整PID参数,使控制系统能自动适应系统特性变化和外部干扰。文章详细介绍了MRAC的工作原理、数学基础,并提供了用C语言实现的实战代码示例,帮助工程师解决传统PID控制在非线性、时变系统中参数整定繁琐的难题。

tequila的博客 903

Java设计模式:23种设计模式(一) 单例模式

目录 什么是单例 单例的利与弊 单例模式实现 懒汉式单例 双重检查锁定——DCL(Double Check Lock) 饿汉式单例 懒汉式与饿汉式的不同 其他单例模式实现 静态内部类单例 枚举单例 登记式单例 破坏单例的方式及解决方法 反序列化 反射 克隆 什么是单例 单例模式(Singleton Pattern)被认为是最简单、最易理解的设计模式。但事实上,要用...

戏流年的博客 400

rv1126平台spi屏调试

st7789v2 i2c调试

zuoanyouzhuan_的博客 2038

Laser-Marking 激光振镜打标机的开源代码 - 下载 - 搜珍网

为了方便开发者的使用和定制化需求,我们在这里提供激光振镜打标机的开源代码,并附带详细的描述。首先,让我们来了解一下激光振镜打标机的基本原理。振镜系统由两个可移动的反射镜组成,可以控制激光束在水平和垂直方向上的偏转角度,从而实现对工件的精确控制。通过这段开源代码,开发者可以根据自己的需求对激光振镜打标机进行二次开发和定制化。你可以修改振镜角度、打标速度等参数,也可以添加其他功能,例如自动识别和追踪等。首先,我们创建了一个串口对象,用于与激光振镜打标机进行通信。函数实现了对用户输入文本的打标操作。

TechProX的博客 1279

Java 枚举实现的单实例是否属于饿汉模式单实例?

枚举里的值确实都相当于final static修饰的变量,和饿汉很相似,但他实际暴露出去的单例变量却不是在启动时就初始化的(你可以debug感受一下),这一点和懒汉很像,因此把枚举实现的单例归为懒汉和饿汉都不ok。 ...

李昊轩的博客 1131

PCL RANSAC采样一致性算法

一直想了解一下RANSAC算法的一些原理,所以就趁着自己闲了下来整理了一下,做了这篇笔记。 文章目录一、简介二、PCL中的RANSAC 一、简介 RANSAC是一种随机参数估计算法。RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,再使用一个预先设定好的阈值与偏差比较,当偏差小于阈值时,该样本点属于模型内样本点(内点),否则就是外样本点(外点)。记录当前的内点的个数,然后重复上述的过程,直到模型中的内点达到最多,那么此时的模型参数即为最

dayuhaitang1的博客 2116

我学设计模式之单例模式:饿汉式单例、懒汉式单例、枚举式单例、容器式单例

2强无敌

cxqiuWind的博客 424

STM32面试知识点总结分析

通过Boot引脚设定,寻找初始地址初始化栈指针 __initial_sp指向复位程序 Reset_Hander设置异常中断 HardFault_Handler设置系统时钟 SystemInit调用C库函数 _main。

嵌入式技术开发 2513

第67步 时间序列建模实战:ARIMA建模(Stata)

第67步 时间序列建模实战:ARIMA建模(Stata)

Jet4505的博客 6820

单例模式(饿汉懒汉、内部类、枚举)

单例模式是创建型模式。单例模式分为饿汉式单例懒汉式单例知识铺垫:Java枚举关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。

m0_60708917的博客 321

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

学习笔记:单例模式

单例模式:单例模式是什么?有啥用?什么时候用?为什么要用?怎样用?(先来一波素质五连) 是什么? 单例模式?字面上理解,单:一个,例:实例,也就是我们所说的对象 有啥用? 是为了资源的重复利用,只需要赋值或者初始化一次,大家就都能重复使用 什么时候用?为什么要用?(只有一份的如日历,只需要一份的如IOC容器) Listener监听器,Calender日历类,IOC容器类,配置信息Config(一搬是单例)这些都是单例的 怎样用?(这个一句话说不了,容我细细道来) 下面我将用饿汉式,懒汉式..

My_SweetXue的博客 247

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

单例模式详解

单例模式

jzp2993538924的博客 257

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

设计模式 —— 单例模式

目录 一、什么是单例设计模式? 二、单例设计模式实现形式 1、饿汉式实现方式一(推荐) 2、饿汉式实现方式一 3、懒汉式实现方式一(线程不安全) 4、懒汉式实现方式二(线程安全,但效率低) 5、懒汉实现方式三(线程不安全) 6、懒汉实现方式四 - DCL 双端检查 + volatile(线程安全) 7、静态内部类方式,JVM 保证单例(推荐) 8、通过枚举实现单例模式(不推荐) 一、什么是单例设计模式? 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的.

认知 行动 坚持 851

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

单例模式之饿汉、懒汉、枚举

单例模式之饿汉懒汉单例---Why Singleton?饿汉模式懒汉模式双检锁静态内部类 static nested class枚举 单例—Why Singleton? 内存里只有一个实例,可以减少内存开销,避免对资源的多重占用,实际操作中需要提供一个全局访问点,严格控制访问。单例模式有两种有名的构建模式:饿汉和懒汉模式。 饿汉模式 饿汉式,创建类的时候 完成 实例化。 class HungerWithFinal{ //私有的构造函数,保证外类不能实例化本类 private HungerWithFina

Merida的勇敢者游戏 1103

Java:单例模式详解

Java:单例模式详解,懒汉饿汉、枚举式、容器式原理、代码完整解释。

小小张自由—>张有博 1925

Java多线程案例之单例模式(懒汉,饿汉,枚举)

本篇文章将介绍Java多线程中的几个典型案例之单例模式,所谓单例模式,就是一个类只有一个实例对象,本文将着重介绍在多线程的背景下,单例模式的简单实现。

未见花闻的博客 4191

单例模式(饿汉式,懒汉式,静态内部类模式,枚举单例模式)

单例模式是 Java 中最简单,也是最基础,最常用的设计模式之一。在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点。下面就来讲讲Java中的N种实现单例模式的写法。 饿汉式 /** * 饿汉式 * 类加载到内存后,就实例化一个单例,JVM保证线程安全 * 简单实用,推荐使用! * 唯一缺点:不管用到与否,类装载时就完成实例化 * Class.forName("") * (话说你不用的,你装载它干啥) */ public class Mgr01 {

qq_36448587的博客 2286

Java设计模式-单例模式

创建者模式概述 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为: 单例模式 工厂方法模式 抽象工程模式 原型模式 建造者模式 1.单例模式概述 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种

Java硬件工程师的博客 2401

java常用设计模式--单例模式

单例模式:程序从系统开始到结束只产生唯一的实例,并且提供该单例的全局访问点,尤其在系统程序中出现功能性地冲突时,就需要用到单例模式。 常见的单例有:日历、配置文件、IOC容器等。 单例的写法分为:饿汉式、懒汉式、注册式、序列化 饿汉式:是指该实例没被调用前,程序运行了系统就初始化保持该实例,就显得比较饥饿,迫不及待,该方式如果系统存在的单例比较多,在系统初始化时就比较消耗内存。 /** ...

飞飞的博客 386

单例模式详解(饿汉式,懒汉式,登记式,枚举式,序列化和反序列)

一、单例模式应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 Spring 中的单例模式完成了后半句话,即提供了全局的访问点 BeanFactory。但没有从构造器级别去 控制单例,这是因为 Spring 管理的是是任意的 Java 对象。 Spring 下默认的 Bean 均为单例。 为了解决并发访问的时候...

m0_37708405的博客 1534

单例模式中的懒汉模式和饿汉模式是什么?

单例模式中的懒汉模式和饿汉模式是什么

6576

【面试题】Java单例设计模式-饿汉式枚举(enum)单例

一、enum关键字 enum关键字是在Java1.5也就是Java SE5之后引入的一个新特性:它通过关键字enum来定义一个枚举类,这个被定义的枚举类继承Enum类,这个枚举类算是一种特殊类,它同样能像其他普通类一样拥有构造器、方法,也能够实现接口,但是它不能再继承其他别的类,因为它的直接父类是Enum类。 在枚举类出现之前Java是将常量放在接口或是放在普通类当中,然后使用public、s...

Sherlock的博客 841

设计模式之单例(饿汉式、懒汉式、注册式枚举、容器)

设计模式 一、饿汉式1. 简单的饿汉式2. 静态代码块写法3. 两种写法的总结 二、懒汉式1. 简单的懒汉式2. 双重检查锁3. 静态内部类 三、注册式1. 枚举2. 容器式

qq_45920729的博客 1183
上一篇: 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)
下一篇: 原型模式——之浅复制与深复制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值