强烈建议用枚举实现单例模式

Java 枚举实现单例模式,线程安全又优雅! 枚举在序列化和反序列化时,并不会调用构造方法,这就防止了反序列化导致的单例破坏的问题。反编译任何一个枚举类会发现,枚举类里的各个枚举项是是通过static代码块来定义和初始化的(可以见后面3.2节反编译分析单例枚举有分析到这个),它们会在类被加载时完成初始化,而java类的加载由JVM保证线程安全,所以,创建一个Enum类型的枚举是线程安全的。因为存在着指令重排序的优化,第2、3步的顺序是不能保证的,最后的执行顺序可能是1-2-3,也可能是1-3-2,假如执行顺序是1-3-2,我们看看会出现什么问题。 阅读详情

懒汉式写法,包含演进过程,通过双重检查和静态方法实现的方式保证线程安全;

//1.懒汉式(延迟加载)
//线程不安全写法
public class Methods{
	private Methods{};
	private static Methods instance = null;
	//获取单例
	public static Methods getInstance(){
		if(instance==null){
			return new Methods();
		}
		return instance;
	}	
}
//双重检查方式写法
public class Methods{
	private Methods{};
	private static Methods instance = null;
	//获取单例
	public static Methods getInstance(){
		if(instance==null){
			//如果为null也只有一个线程能进入,不满足条件最终走最外部的那个return
			synchronized(Methods.class){
				if(instance==null){
					return new Methods();
				}
			}
		}
		return instance;
	}	

}
//上述的写入在synchronized里面的代码 存在指令重排序的问题,如果先给instance分配内存地址,然后再去实例化对象,这样先进入到线程已经复制,后进入的线程也无法获取到
//双重加锁 防止指令重排序的写法
public class Methods{
	private Methods{};
	private volatile static  Methods instance = null;
	//获取单例
	public static Methods getInstance(){
		if(instance==null){
			//如果为null也只有一个线程能进入,不满足条件最终走最外部的那个return
			synchronized(Methods.class){
				if(instance==null){
					return new Methods();
				}
			}
		}
		return instance;
	}	

}
//基于静态内部类的实现 原理是类初始化的时候,只有一个类能获取到类初始化锁
public class Methods{
	private Methods{};
	private static class InnerMethods{
		private static Methods methods = new Methods{};
	}
	public static Methods getInstance(){
		return InnerMethods.methods;
	}
	
}

饿汉式写法很简单,饿汉式最大的缺点就是没有延迟加载的效果,如果一个单例从项目启动一直都没有被使用,会造成很大内存浪费;

//2.饿汉式(没有延迟加载的效果)
public class Methods{
	private final static Methods methods = new Methods();
	private Methods{};
	public static Methods getInstance(){
		return methods;
	}
	
}

既然饿汉式和懒汉式的写法看似已经非常完美了,那为何还需要强调使用枚举来实现单例模式;原因在于上述两种实现方式有两个很大的问题,就是序列化破坏和反射攻击;

序列化攻击:利用单例获取的对象进行序列化,然后在将序列化的对象反序列化,对比两者不相同;

反射攻击:同样的道理,通过反射获取到的对象和实例化的对象,两者不相等;

小伙伴可以亲自试一试便知道,至于具体是什么原因导致的,由于篇幅原因,这里不赘述,小伙伴可以参考网上相关的资料;

那么我们如何才能解决上述两个问题呢,那就是我们这篇博客的主题,通过枚举的方式实现单例模式;代码也非常简洁;

public enum Methods{
	INSTANCE;
	
	public static Methods getInstance(){
	  return INSTANCE; 
	}
	
}

 

使用枚举实现单例模式——为什么是个好主意? 在软件开发中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在实现单例模式时,有多种方法可供选择,而使用枚举是一种被广泛认可的有效方式。本文将详细解释为什么强烈建议使用枚举来实现单例编程,并提供相应的源代码作为示例。 阅读详情

相关推荐

C# 实现单例模式

一个用C#写的 实现单例模式的源码程序和大家分享交流一下

单例的最佳实现 枚举

首先看下枚举实现的单例类 普通的类 public class Controller { public Controller() { } public void func(){ System.out.println("1"); } } 我想把它变成单例的(用一个枚举类持有想要实现单例的普通类) public enum ControllerHolder { INSTANCE; private Controller controller; .

qq345oo的博客 235

c#单例模式(Singleton)的6种实现

主要介绍了c#单例模式(Singleton)的6种实现 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

单例模式-Java实现-非延迟加载、延迟加载

单例模式:确保在任何时候,该类只有唯一 一个实例。 单例的创建有两种方式: 1、非延迟加载:不管什么时候要使用,先提前创建实例。 2、延迟加载:等到真正要使用的时候才去创建实例,不用时不要去创建。 第一种:非延迟加载 public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { }...

Never Limit 987

【Web攻防】SQLMap实战进阶:从数据猜解到高权限渗透的全流程指南

本文介绍了SQLMap工具在Web安全渗透测试中的实战应用,重点讲解了数据猜解、高权限操作、复杂请求提交、Tamper脚本开发和指纹绕过等核心场景。文章提供了可直接复用的命令示例,包括数据库信息获取、文件读写、命令执行等操作,并详细说明了POST/JSON/Cookie注入的实现方法。同时,介绍了Tamper脚本的开发模板和指纹伪装技巧,帮助降低检测风险。最后强调SQLMap在自动化渗透全链路中的价值,从漏洞发现到权限提升的完整流程,并提供了优化测试效率的实用建议。所有技术内容仅限合法授权场景使用。

YsChunQiu777的博客 440

永磁同步电机矢量控制(十一)——基于损耗模型的PMSM效率优化策略

本文深入探讨了永磁同步电机(PMSM)基于损耗模型的效率优化策略,详细分析了铜损和铁损的构成与建模方法,并提出了最小损耗控制策略的实现方案。通过与传统MTPA控制的对比,展示了在不同工况下的效率提升效果,同时讨论了工程实现中的关键问题与解决方案,为PMSM的高效运行提供了理论支持和实践指导。

7z8x2c4v6b9的博客 231

细说单例设计模式

单例设计模式细说

weixin_41927555的博客 527

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5827

总结单例模式的几种实现方式及优缺点

几种创建方式总结: 1、饿汉式:类初始化的时候,会立即加载该对象,线程天生安全,调用效率高。 2、懒汉式:类初始化时,不会初始化该对象,真正需要使用的时候才会去创建该对象,具备懒加载功能。 3、双重检测方式(因为JVM本身重排序的原因,可能会出现多次的初始化) 4、枚举单例:使用枚举实现单例模式,实现简单、调用效率高,枚举本身就是单例,由JVM从根本上提供保障,避免通过反射和反序列化的漏洞...

worldchinalee的博客 1591

ComfyUI破限版全中文AI绘画环境搭建与工作流实战指南

节点式工作流是AI绘画领域的核心技术架构,通过将图像生成过程拆分为可配置的模块化节点,实现了对Stable Diffusion模型的精细化控制。其技术原理基于数据流编程范式,每个节点负责特定功能处理,如文本编码、采样器配置和VAE解码等。这种设计在工程实践中的核心价值在于提供了可追溯、可复用的可视化工作流,特别适合需要参数调优和批量生产的商业场景。ComfyUI作为典型的节点式AI绘画工具,在破限版中针对中文用户优化了界面支持和显卡兼容性,显著降低了技术门槛。在实际应用中,结合ControlNet和LoRA

weixin_29038155的博客 446

无线通信基础:调制与解调技术_(42).7.3.2多进制频移键控解调(MFSK解调)

MFSK解调是一种通过频谱分析和频率检测来恢复数字信号的技术。本文介绍了MFSK解调的基本原理,包括信号接收、频谱分析、频率检测和符号判决。在实际应用中,噪声会对解调性能产生影响,因此引入了信噪比优化和多步判决方法来提高解调的准确性。通过性能评估,可以更好地理解MFSK解调在不同噪声环境下的表现。这些方法和技术为MFSK在实际通信系统中的应用提供了理论和实践基础。

2401_87715305的博客 1316

为什么我强烈建议大家使用枚举来实现单例

转载自   为什么我墙裂建议大家使用枚举来实现单例   关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的破坏等。 单例相关文章一览: 设计模式(二)——单例模式 设计模式(三)——JDK中的那些单例 单例模式的七...

俊墨客 911

Python爬虫实战:京东/淘宝商品价格与评论监控系统——从User-Agent伪装到编码陷阱的全面攻克

在电商数据驱动决策的今天,无论是个人消费者想抓住历史低价,还是市场分析师需要追踪竞品动态,抑或是算法交易员依赖实时价格信号,自动化的商品价格与评论监控系统都已成为不可或缺的工具。然而,电商平台的反爬虫策略日益严苛,字符编码的“暗坑”更是让初学者屡屡碰壁。本文将以京东(JD.com和淘宝(Taobao.com两大主流平台为目标,手把手带你构建一个稳定、高效的商品监控爬虫。User-Agent伪装——如何模拟真实浏览器行为,突破初级反爬。GBK/UTF-8编码混战。

2201_76125261的博客 75

为什么强烈建议大家使用枚举来实现单例

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33726313的博客 109

Megatron-LM中的TP、PP、DP、SP、CP并行

SP主要优化的是激活内存,它沿序列维度切分部分激活,适用于较短序列并行。CP主要解决的是长序列的显存问题,它沿序列维度切分所有激活和输入,并且对注意力机制也进行并行处理。二者可以组合使用,特别是当 TP > 1 并且需要处理长序列时,通过启用 SP 和 CP 可以最大化地优化内存使用和加速计算。

u013250861的博客 861

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

枚举类——概述、常用方法、自定义枚举类、Enum创建枚举类

一、枚举类的概述 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类 2.当需要定义一组常量时,强烈建议使用枚举类 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式。 二、枚举类中的常用方法 values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。 valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。 toString

Guizy 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

枚举到底好在哪?为什么好多人都强烈建议使用!

枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如...

weixin_43167418的博客 1235

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

枚举类都不知道,还敢说自己会Java?

本文主要针对面试中经常被问到的枚举类的热点、难点由浅入深进行深入分析

Mr_wxc的博客 6249

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【设计模式】单例模式的八种写法分析

网上泛滥流传单例模式的写法种类,有说7种的,也有说6种的,当然也不排除说5种的,他们说的有错吗?其实没有对与错,刨根问底,写法终究是写法,其本质精髓大体一致!因此完全没必要去追究写法的多少,有这个时间还不如跟着宜春去网吧偷耳机、去田里抓青蛙得了,一天天的....

宜春 1万+

详解枚举类

一、枚举类的基本介绍 1.类的对象只有有限个,确定的。我们称此类为枚举类 2.当需要定义一组常量时,强烈建议使用枚举类。 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 二、如何自定义枚举类 1.方式一:jdk5.0之前,自定义枚举类 (1) public class SeasonTest { public static void main(String[] args){ ...

qq_45370866的博客 1812

枚举类详解

目录 1.介绍 1.1什么是枚举类? 1.1.1自定义枚举类代码演示: 1.1.2enum关键字定义枚举类 1.介绍 1.1什么是枚举类? 定义:类的对象只有有限个,确定的。比如: 星期:Monday(星期一)、......、Sunday(星期天) 性别:Man(男)、Woman(女) 季节:Spring(春节)......Winter(冬天) 订单状态:Nonpaym...

wd_888的博客 850
上一篇: Zookeeper 和 Eureka 之间的区别
下一篇: 理解Spring Bean生命周期
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值