实用指南:Java 单例模式详解

news/2025/10/7 12:19:07/文章来源:https://www.cnblogs.com/wzzkaifa/p/19128351

目录

1. 饿汉式(Eager Initialization)

2. 懒汉式(Lazy Initialization)

3. 懒汉式 + 同步锁(线程安全)

4. 双重检查锁(Double-Checked Locking)

5. 静态内部类(推荐)

6. 枚举(最佳实践)

单例模式的序列化与反序列化问题

单例模式适用场景

总结


单例模式是 Java 中最简单且最常用的设计模式之一,其核心思想是确保一个类只有一个实例,并提供全局访问点。下面分别详解 Java 中的单例模式:

1. 饿汉式(Eager Initialization)

特点:类加载时立即创建实例,线程安全。
缺点:不支持延迟加载,可能造成资源浪费。

public class Singleton {
private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有构造函数public static Singleton getInstance() {
return INSTANCE;
}
}

2. 懒汉式(Lazy Initialization)

特点:首次调用时创建实例,支持延迟加载。
缺点:多线程环境下不安全。

public class Singleton {
private static Singleton INSTANCE;private Singleton() {}public static Singleton getInstance() {
if (INSTANCE == null) { // 多线程可能同时进入此判断
INSTANCE = new Singleton();
}
return INSTANCE;
}
}

3. 懒汉式 + 同步锁(线程安全)

特点:通过synchronized保证线程安全。
缺点:每次调用都加锁,性能开销大。

public class Singleton {
private static Singleton INSTANCE;private Singleton() {}public static synchronized Singleton getInstance() { // 方法级同步
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}

4. 双重检查锁(Double-Checked Locking)

特点:线程安全且性能优化,仅首次创建时加锁。
关键点:使用volatile关键字禁止指令重排序。

public class Singleton {
private static volatile Singleton INSTANCE; // 防止指令重排序private Singleton() {}public static Singleton getInstance() {
if (INSTANCE == null) { // 第一次检查,不加锁
synchronized (Singleton.class) {
if (INSTANCE == null) { // 第二次检查,加锁后
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}

5. 静态内部类(推荐)

特点:线程安全、支持延迟加载,实现简洁。
原理:JVM 保证静态内部类的初始化线程安全。

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

6. 枚举(最佳实践)

特点:线程安全、自动支持序列化机制、防止反射攻击。
推荐场景:需要绝对防止单例被破坏的场景。

public enum Singleton {
INSTANCE;// 可以添加方法
public void doSomething() {
System.out.println("Singleton method called");
}
}

单例模式的序列化与反序列化问题

如果单例类实现了Serializable接口,需添加readResolve()方法防止反序列化时创建新实例:

private Object readResolve() {
return INSTANCE;
}

单例模式适用场景

  • 资源管理器(如数据库连接池、线程池)。
  • 配置文件管理。
  • 日志记录器。
  • GUI 中的窗口管理器。

总结

推荐使用静态内部类枚举实现单例模式:

避免使用普通懒汉式,在多线程环境下需使用双重检查锁或更优方案

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

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

相关文章

oppoR9m刷Linux系统: 安装MTK USB VCOM驱动

前言全局说明安装MTK USB 驱动注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢…

建设网站费用计入什么科目山东企业展厅设计公司

缓存技术在现代Web开发中至关重要,尤其是在高并发的环境中,缓存能够有效减少数据库访问压力、提高系统性能。Redis作为最流行的内存数据存储系统之一,常用于缓存管理。本节将讲解如何在Spring Boot项目中集成Redis,实现缓存管理&a…

数据结构与算法学习笔记(Acwing 提高课)----动态规划树形DP - 详解

数据结构与算法学习笔记(Acwing 提高课)----动态规划树形DP - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

注册网站卖钱最多的人中山网站建设哪家便宜

我刚刚开始为Isis开发 OpenJPA对象库 。 在一般情况下,可以在persistence.xml文件中注册实体类型。 但是,Isis是一个框架,可以构建自己的元模型,并且可以自行确定哪些类构成实体。 因此,我不想强​​迫开发人员重复自己…

自己做网站还能挣钱吗家电网站建设

建立openstack quantum开发环境 作者:张华 发表于:2012-4-6 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[特殊字符] FFmpeg 学习笔记 - 详解

[特殊字符] FFmpeg 学习笔记 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

.NET周刊【9月第3期 2025-09-21】

国内文章 Runtime Async - 步入高性能异步时代 https://www.cnblogs.com/hez2010/p/19097937/runtime-async 本文详细阐述了同步与异步代码的区别以及 async/await 的机制。同步代码阻塞线程,异步代码则不阻塞线程,依…

通过实验直观理解神经网络:ReLU网络与几何解释

本文通过可视化实验探索ReLU神经网络的工作机制,从几何角度分析神经元如何通过折纸般的折叠操作逼近复杂函数,并讨论训练过程中的优化现象与边缘学习难题。ADD / XOR / ROL:帮助我更好理解神经网络的实验(第1篇) …

无锡网站公司哪家好网站访问慢的原因

基于springBoot旅游管理系统设计与实现 一、摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助…

网站专题设计稿免费网站建设软件推荐

第一部分:安装k8s 1.28.2: 注意:因国内无法访问Google ,需要使用阿里云进行安装 系统准备 更新系统:确保你的Ubuntu系统是最新的。运行以下命令来更新系统: sudo apt-get update sudo apt-get upgrade -y sudo apt-get dist-upgrade -y安装必要的工具:安装curl和其他可能需…

CCPC2023哈尔滨 游记(VP)

有史以来打的最差的一场区域赛 VP,$2t$ 获得铁尾。省流 有史以来打的最差的一场区域赛 VP,\(2t\) 获得铁尾。9.30 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 要放国庆假期,简和叶都说要提前走,这场在开…

2025教练技术行业深度剖析:目标人群、费用与品牌选择

在当今竞争激烈的商业环境中,教练技术作为一种提升个人和团队能力的有效工具,正逐渐受到广泛关注。那么,排名靠前的教练技术课程的目标人群是谁?费用大概多少?哪些品牌靠谱且性价比高呢?让我们一同深入探讨。 目…

统计备注

统计备注一些基础的统计学备注笔记统计备注 1、高斯分布图解

单例模式的类和静态方法的类的区别和使用场景 - 指南

单例模式的类和静态方法的类的区别和使用场景 - 指南2025-10-07 12:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

LGP9871 [NOIP 2023] 天天爱打卡 学习笔记

LGP9871 [NOIP 2023] 天天爱打卡 学习笔记 Luogu Link 前言 经典题了属于是。写 \(\texttt{LGP12581}\) 时特此来回顾。 当年是有多么糖啊。希望现在只有棒棒没有糖吧。 题意简述 小 \(\text{T}\) 同学非常热衷于跑步。…

【OpenGL ES】Windows上OpenGL环境搭建

1 前言 ​ Windows 的图形 API 是 DirectX,对 OpenGL 的支持比较有限(系统自带的 opengl32.dll 仅支持 OpenGL 1.1 版本),因此在 Windows 上进行OpenGL 开发时,通常需要借助第三方库或工具来支持更高版本的 Op…

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现策略优化的理论基础与算法实现 3.2 REINFORCE: 最早的策略梯度算法 在完成策略梯度定理的推导后,我们获得了梯度的理论形式: \[\nabla_\theta J(\pi_\thet…

惠州做公司网站广州软件开发培训班

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接,粘贴下载;解压到文件夹; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具,工具界面击烧写步骤如图所示: 推荐…