/**
* 1. 高性能单例模式:饿汉式
* 优点:实现简单,天然线程安全
* 缺点:非懒加载。在类加载时就创建实例,如果创建实例很耗时或占用大量内存,但一直未被使用,会造成资源浪费和启动速度变慢
*/
class Singleton1 {
// 类加载时就创建实例(静态常量)
private static final Singleton1 INSTANCE = new Singleton1();
// 私有构造方法,防止外部通过 new 创建对象
private Singleton1() {
// 可以防止反射破坏单例
if (INSTANCE != null) {
throw new RuntimeException("单例对象已创建");
}
}
// 提供全局访问点
public static Singleton1 getInstance() {
return INSTANCE;
}
}
/**
* 2. 高性能单例模式:懒汉式,双重检查锁定
* 优点:实现了线程安全的懒加载,性能较高
* 缺点:实现相对复杂,需要正确使用 voliate 关键字。
*/
class Singleton2 {
// voliate 防止指令重排序,确保 INSTANCE 变量被正确地初始化。
private static volatile Singleton2 INSTANCE;
// 私有构造方法,防止外部通过 new 创建对象
private Singleton2() {
// 可以防止反射破坏单例
if (INSTANCE != null) {
throw new RuntimeException("单例对象已创建");
}
}
public static Singleton2 getInstance() {
//第一次检查:如果实例已存在,直接返回,避免不必要的同步。
if(INSTANCE == null) {
//同步块:只在实例未创建时才进入,大大减少锁的竞争。
synchronized (Singleton2.class) {
//第二次检查:防止多个线程同时通过第一次检查,并在此等待。
if(INSTANCE == null) {
INSTANCE = new Singleton2();
}
}
}
return INSTANCE;
}
}
/**
* 3. 高性能单例模式:静态内部类
* 优点:代码简洁,完美实现了线程安全的懒加载,性能极高。
* 缺点:无。这是最推荐的实现方式之一。
*/
class Singleton3 {
// 静态内部类,当外部类被加载时,其内部类 SingletonInner 不会立即被加载。
private static class SingletonHolder {
private static final Singleton3 INSTANCE = new Singleton3();
}
public static Singleton3 getInstance() {
// 只有当第一次调用 getInstance() 方法时,JVM 才会加载 SingletonHolder 类。
// 类加载的过程是线程安全的,JVM 会保证 INSTANCE 只被初始化一次。
return SingletonHolder.INSTANCE;
}
// 私有构造方法,防止外部通过 new 创建对象
private Singleton3() {
// 可以防止反射破坏单例
if (SingletonHolder.INSTANCE != null) {
throw new RuntimeException("单例对象已创建");
}
}
}
/**
* 4. 高性能单例模式:枚举(Enum),《Effective Java》作者 Joshua Bloch 极力推崇的方式。
* 它不仅能防止多线程问题,还能自动支持序列化机制,防止反序列化时创建新的对象。
* 优点:实现最简单,天然线程安全,且能防止反序列化创建新对象。
* 缺点:非懒加载(与饿汉式类似),且无法继承其他类。
*/
enum Singleton4 {
INSTANCE;
public void doSomething() {
System.out.println("xxx");
}
}
public class Main{
public static void main(String[] args) {
//1. 高性能单例模式:饿汉式
Singleton1 s1 = Singleton1.getInstance();
System.out.println(s1);
//2. 高性能单例模式:懒汉式,双重检查锁定
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s2);
//3. 高性能单例模式:静态内部类
Singleton3 s3 = Singleton3.getInstance();
System.out.println(s3);
//4. 高性能单例模式:直接整个枚举
Singleton4 s4 = Singleton4.INSTANCE;
s4.doSomething();
}
}
相关推荐
【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析
本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。
C++中的单例模式和工厂模式
最近在学C++过程中,被两个新名词单例模式和工厂模式搞晕了,到网上找了这两篇博客,本人觉得写得很清晰,有条理,分享下 单例模式:http://www.jellythink.com/archives/82 工厂模式:http://www.jellythink.com/archives/62
永磁同步电机解耦控制实战:从电流反馈到内模解耦的算法演进与选型指南
本文深入探讨了永磁同步电机高性能驱动中的核心挑战——交叉耦合问题,并对比分析了电流反馈解耦和内模解耦两大主流算法的原理、性能与适用场景。文章指出,电流反馈解耦动态响应快但对参数敏感,内模解耦鲁棒性更强但略有滞后,为工程师在不同应用需求下的算法选型提供了清晰的实战指南。
设计模式之单例模式的四种实现
设计模式之单例模式 **单例模式(Singleton)**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 结构图 常见应用: 日志,驱动,缓存和线程池等。 实现方法: Eager initialization(饿汉式初始化) Static block initialization(静态块初始化) Lazy initialization(懒汉式初始化) Bill Pugh Singleto...
STM32F103单片机驱动TM1637数码管显示模块
最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637四位数码管显示模块 实际运行效果 下面先看一下TM1637和数码管连接的具体线路图 实际使用的模块没有带按键,只用了4个数码管,模块和单片机连接只需要4根线VCC、GND、CLK、DIO。芯片和单片机通信使用的是I2C总线,下面就来说一下如何...
MySQL等保三级合规实践:如何安全配置root账户的本地与受信主机登录策略
本文详细介绍了MySQL在等保三级合规框架下如何安全配置root账户的本地与受信主机登录策略。通过分析root账户的特殊保护需求,提供三种安全加固方案,包括限制访问范围、限定登录IP和完全禁止远程登录,并指导创建安全的远程管理账户。文章还涵盖了密码策略强化、日志审计配置和网络层防护等关键合规要求,帮助用户实现MySQL的等保三级全面合规。
单例模式—四种写法详解
单例定义: 一个类只有一个实例,并提供一个全局访问点。 巧妙利用了编程语言的一些语法规则:构造函数private, 然后提供一个public的方法返回类的一个实例;又方法和返回的类的实例都是static类型,所以只能被类所拥有,而不能被实例化类的对象拥有。这样一个类就只能有一个实例了。 最简单的写法(非线程安全,有叫它“懒汉式”的) public class Sin...
虚幻商城 Quixel 免费资产一键入库
在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。
单例模式(C++)
单例模式是设计模式中
万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!
见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)
如何通过conda安装HyPhy教程
本文介绍了在Ubuntu系统上通过conda安装分子进化分析工具HyPhy的详细步骤。首先创建conda环境并指定Python 3.8版本,然后通过bioconda通道安装HyPhy软件包。安装完成后可通过conda list命令验证安装。文中还特别指出可能遇到的libcrypto.so.1.1共享库缺失错误,并提供了解决方案的参考链接。该教程配有安装过程截图,帮助用户直观了解操作流程和验证安装结果。
单例模式的研究与改进
转载(Singleton(单例)模式和Double-Checked Locking(双重检查锁定)模式) 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,...
C++ PCL点云处理实战专栏
工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。
单例模式
问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的。在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
JAVA单例模式(线程安全,高并发性能又高)示例:
JAVA单例模式(线程安全,高并发性能又高) 利用锁的原理,来比较一下四种单例模式。 第一种:线程不安全,不正确 1 class Singleton { 2 3 private static Singleton instance; 4 5 private Singleton() { 6 7 } 8 9 public static...
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
1.单例模式有哪几种常见的实现方式?
本文探讨了在纯JavaSE项目中如何通过单例模式替代SpringBoot的依赖注入功能。文章首先分析了SpringBoot中通过@Component和@Bean注册Bean的方式,以及@Autowired和@Resource实现依赖注入的机制。随后重点介绍了单例模式的四种实现方案:饿汉式(立即加载)、线程不安全懒汉式、线程安全懒汉式(synchronized修饰)以及双重检查锁定(DCL)。每种方案都提供了示例代码,并分析其特点和使用场景。DCL方式因其兼顾线程安全和性能成为推荐方案。本文为无法使用Spri
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
【多线程系列】单例模式
单例模式是校招中最常考的设计模式之一。 啥是设计模式?
Java 单例模式深度解析:从实现到底层原理
摘要:单例模式是确保类仅有一个实例的设计模式。理想单例需满足懒加载、线程安全、防反序列化和反射攻击4个条件。常见实现方式包括:1)枚举模式(最优解,完全满足所有条件);2)饿汉式(简单但不防反射和序列化);3)静态内部类(完美懒加载);4)双重检查锁(需volatile防止指令重排)。其中枚举模式因JVM底层保护机制成为最安全方案,而静态内部类则是无法使用枚举时的最佳替代方案。
Singleton 多线程
单例模式 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个s...
单例模式的几种实现方式
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
单例模式:秒懂五种实现方式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式指的是一个类只能实例化一次,并提供全局访问点来访问该实例。在Java编程中,单例模式非常有用,因为它可以确保类只有一个实例,并且该实例可以被其他对象访问,而不需要再创建新的对象。在本文中,我们详细介绍了Java单例模式的设计原理、几种典型的实现方式以及优缺点分析。单例模式是一种非常实用且常用的设计模式,它可以帮助我们提高代码的可读性和可维护性,节省系统资源,提高性能。
单例模式之5种实现方式
目录(一) 单例模式概述(二) 单例模式实现的方式1.饿汉式2.懒汉式3. 双重检查4. 静态内部类5. 枚举(三) 总结 (一) 单例模式概述 单例模式(Singleton Pattern): 是Java中最简单的设计模式之一, 它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类, 该类负责创建自身的实例对象 且 创建的对象只存在一个实例. 这个类提供了一种访问其唯一对象的方式, 可以直接访问. 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 且 单例类必须给所有其他对象提供这一实例
单例模式实现的多种方式
文章目录饿汉式构建懒汉式线程安全构建静态内置类实现单例模式线程安全的单例模式: 双重检验锁(DCL) 饿汉式构建 饿汉式,线程不安全 是否 Lazy 初始化:是 是否多线程安全:否 实现难度:易 描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,...
浅谈单例模式的实现方式
单例模式(来自菜鸟教程) 单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 单例模式的要求 构造方法必须私有化(确保只有自己能创建) 以静...
Java单例模式超详细教程:8种实现方式手把手教学
Java单例模式详解:8种实现方式对比与选型指南 本文系统介绍了Java单例模式的8种实现方式,从基础到高级层层递进: 基础实现:包括饿汉式(简单但浪费资源)和懒汉式(需解决线程安全问题) 线程安全方案:同步方法版、双重检查锁(DCL)和静态内部类方案 高级方案:枚举单例(最安全)、ThreadLocal线程级单例和容器管理式单例
244



被折叠的 条评论
为什么被折叠?



