Java单例模式:实现全局唯一对象的艺术

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


一、什么是单例模式?

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。其核心价值在于:

  • 避免重复创建对象,节省系统资源
  • 保证全局状态一致性
  • 控制共享资源的访问

二、经典实现方式

1. 饿汉式(Eager Initialization)

public class EagerSingleton {// 类加载时立即初始化private static final EagerSingleton instance = new EagerSingleton();// 私有构造方法private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}

特点

  • 线程安全
  • 可能造成资源浪费(未使用即加载)

2. 懒汉式(Lazy Initialization)

public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

特点

  • 延迟加载
  • 同步锁影响性能

3. 双重校验锁(Double-Checked Locking)

public class DCLSingleton {private static volatile DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}

关键点

  • volatile防止指令重排序
  • 减少同步代码块范围

4. 静态内部类(Holder Pattern)

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

优势

  • 天然线程安全
  • 延迟加载
  • 无同步性能损耗

5. 枚举实现(Effective Java推荐)

public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务方法}
}

优点

  • 绝对防止反射攻击
  • 自动处理序列化
  • 代码最简洁

三、单例模式的应用场景

  1. 配置管理器
  2. 数据库连接池
  3. 日志记录器
  4. 线程池管理
  5. 缓存系统

四、潜在问题与解决方案

问题类型解决方案
反射攻击私有构造器添加实例存在检查
序列化破坏实现readResolve()方法
多类加载器指定类加载器
多线程环境选择合适的线程安全实现方案

五、最佳实践建议

  1. 优先选择枚举或静态内部类实现
  2. 谨慎使用synchronized关键字
  3. 考虑依赖注入框架(如Spring)管理单例
  4. 避免在分布式系统中滥用单例
  5. 单元测试时注意单例状态重置

六、单例模式 vs 静态类

特性单例模式静态类
接口实现支持不支持
延迟加载可实现不可实现
继承机制支持不支持
内存管理可被GC回收常驻内存

总结:单例模式是Java开发中应用最广泛的设计模式之一,但需要根据具体场景选择合适的实现方式。现代开发中,建议优先考虑枚举实现或结合IoC容器管理对象生命周期,在保证功能性的同时提高代码的可维护性。

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

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

相关文章

Oracle 复制表结构(含索引、主键)操作指南

Oracle 复制表结构(含索引、主键)操作指南 1. 复制基础表结构 -- 创建空表结构(不复制数据) CREATE TABLE new_table AS SELECT * FROM old_table WHERE 10;2. 复制主键约束 -- 查询原表主键信息 SELECT constraint_name, co…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新一个对象时,你需要创建一个新的对象(或者将其拷贝一份)…

基于 GoFrame 框架的电子邮件发送实践:优势、特色与经验分享

1. 引言 如果你是一位有1-2年Go开发经验的后端开发者,可能已经熟悉了Go语言在性能和并发上的天然优势,也曾在项目中遇到过邮件发送的需求——无论是用户注册时的激活邮件、系统异常时的通知,还是营销活动中的批量促销邮件,邮件功…

AndroidStudio编译报错 Duplicate class kotlin

具体的编译报错信息如下: Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…

后端面试问题收集以及答案精简版

思路 不要问什么答什么 要学会扩充 比如问你go map的原理 map 是什么 数据结构,字典,k/v 结构map的应用场景有哪些 快速查找、计数器、配置管理、去重、缓存实现map有哪些限制 无序性、非线程安全的读写map的key的访问 v: mp[key] v,ok : mp[key] for…

MicroPython 开发ESP32应用教程 之 I2S、INMP441音频录制、MAX98357A音频播放、SD卡读写

本课程我们讲解Micropython for ESP32 的i2s及其应用,比如INMP441音频录制、MAX98357A音频播放等,还有SD卡的读写。 一、硬件准备 1、支持micropython的ESP32S3开发板 2、INMP441数字全向麦克风模块 3、MAX98357A音频播放模块 4、SD卡模块 5、面包板及…

UE5 物理模拟 与 触发检测

文章目录 碰撞条件开启模拟关闭模拟 多层级的MeshUE的BUG 触发触发条件 碰撞 条件 1必须有网格体组件 2网格体组件必须有网格,没有网格虽然可以开启物理模拟,但是不会有任何效果 注意开启的模拟的网格体组件会计算自己和所有子网格的mesh范围 3只有网格…

微信小程序 - swiper轮播图

官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

深入探究C#官方MCP:开启AI集成新时代

一、引言 在当今数字化时代&#xff0c;.NET 开发领域不断演进&#xff0c;而 C# 官方 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的出现&#xff0c;无疑为开发者们带来了全新的机遇与挑战。随着人工智能技术的迅猛发展&#xff0c;将 AI…

二分查找法

使用二分查找法的前提&#xff1a;&#xff08;1&#xff09;数组为有序数组. &#xff08;2&#xff09;数组中无重复元素. 二分的两种写法&#xff1a; 方法一&#xff1a;[left&#xff0c;right] class Solution { public:int search(vector<int>& nums, int …

HarmonyOS:页面滚动时标题悬浮、背景渐变

一、需求场景 进入到app首页或者分页列表首页时&#xff0c;随着页面滚动&#xff0c;分类tab要求固定悬浮在顶部。进入到app首页、者分页列表首页、商品详情页时&#xff0c;页面滚动时&#xff0c;顶部导航栏&#xff08;菜单、标题&#xff09;背景渐变。 二、相关技术知识点…

鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】

前期说明 配置&#xff1a;2台鲲鹏32C2 2Atlas300I duo&#xff0c;之前看网上文档&#xff0c;目前GPUstack只支持910B芯片&#xff0c;想尝试一下能不能310P也部署试试&#xff0c;毕竟华为的集群软件要收费。 系统&#xff1a;openEuler22.03-LTS 驱动&#xff1a;24.1.rc…

React中 点击事件写法 的注意(this、箭头函数)

目录 ‌1、错误写法‌&#xff1a;onClick{this.acceptAlls()} ‌2、正确写法‌&#xff1a;onClick{this.acceptAlls}&#xff08;不带括号&#xff09; 总结 方案1&#xff1a;构造函数绑定 方案2&#xff1a;箭头函数包装方法&#xff08;更简洁&#xff09; 方案3&am…

【路由交换方向IE认证】BGP选路原则之Weight属性

文章目录 一、路由器BGP路由的处理过程控制平面和转发平面选路工具 二、BGP的选路顺序选路的前提选路顺序 三、Wight属性选路原则规则9与规则11的潜移默化使用Weight值进行选路直接更改Weight值进行选路配合使用route-map进行选路 四、BGP邻居建立配置 一、路由器BGP路由的处理…

Missashe考研日记-day20

Missashe考研日记-day20 1 高数 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天当然是刷题啦&#xff0c;做不等式的证明板块的真题&#xff0c;证明题懂的都懂&#xff0c;难起来是真的一点思路都没有&#xff0c;这个板块还没做完&#xff0c;做完再总结题型。 2…

了解JVM

一.JVM概述 1.JVM的作用 把字节码编译为机器码去执行,负责把字节码装载到虚拟机中 现在的 JVM 不仅可以执行 java 字节码文件,还可以执行其他语言编译后的字节码文件,是一个跨语言平台 2.JVM的组成部分 类加载器&#xff08;ClassLoader&#xff09;运行时数据区&#x…

LeetCode LCR157 套餐内商品的排列顺序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;从问题到解决方案的完整解析 问题背景 在编程和算法设计中&#xff0c;生成字符串的所有排列是一个经典问题。它不仅出现在算法竞赛中&#xff0c;也在实际开发中有着广泛的应用&#xff0c;比如生成所有可能的…

pgsql:关联查询union(并集)、except(差集)、intersect(交集)

pgsql:关联查询union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客

微信小程序中使用ECharts 并且动态设置数据

项目下载地址 GitHub 地址 https://github.com/ecomfe/echarts-for-weixin 将当前文件夹里的内容拷贝到项目中 目录&#xff1a; json: {"usingComponents": {"ec-canvas": "../components/ec-canvas/ec-canvas"} }wxml&#xff1a; <ec…

RV1126 人脸识别门禁系统解决方案

1. 方案简介 本方案为类人脸门禁机的产品级解决方案,已为用户构建一个带调度框架的UI应用工程;准备好我司的easyeai-api链接调用;准备好UI的开发环境。具备低模块耦合度的特点。其目的在于方便用户快速拓展自定义的业务功能模块,以及快速更换UI皮肤。 2. 快速上手 2.1 开…