当前位置: 首页 > news >正文

单例模式

定义

        单例模式(Singleton Pattern)是java最简单的设计模式之一,用于保证某个类在运行期间只有一个实例对外提供服务,我们称这种类型的类为单例类。

设计原则

        1. 保证一个类只有一个实例;

        2. 为实例提供一个全局访问点。

实现方式

饿汉式

代码示例

package com.sumlv.javase.note;/*** 单例示例** @Auther: yuzhuo.song* @Date: 2025-03-14*/
public class Singleton {private static Singleton instance = new Singleton();public static Singleton getInstance() {return instance;}/*** 用于避免序列化对单例的破坏* 如果单例类没有实现序列化接口则不需要该方法* * @return 实例对象*/private Object readResolve() {return instance;}/*** 用于避免反射对单例的破坏*/private Singleton() {if (instance != null) {throw new RuntimeException("illegal access");}}}

补充说明

        1. 线程安全;

        2. 不支持延时加载;

        3. 获取实例对象速度较快;

        4. 如果实例对象较大且一直未使用会造成内存浪费。

懒汉式

代码示例

package com.sumlv.javase.note;/*** 单例示例** @Auther: yuzhuo.song* @Date: 2025-03-14*/
public class Singleton {private static Singleton instance;public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}/*** 用于避免序列化对单例的破坏* 如果单例类没有实现序列化接口则不需要该方法* * @return 实例对象*/private Object readResolve() {return instance;}/*** 用于避免反射对单例的破坏*/private Singleton() {if (instance != null) {throw new RuntimeException("illegal access");}}}

补充说明

        1. 支持延迟加载;

        2. 保证多线程模式下实例的唯一性;

        3. 并发度低,在频繁调用时会产生性能瓶颈。

双重检查锁

代码示例

package com.sumlv.javase.note;/*** 单例示例** @Auther: yuzhuo.song* @Date: 2025-03-14*/
public class Singleton {private static volatile Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}/*** 用于避免序列化对单例的破坏* 如果单例类没有实现序列化接口则不需要该方法* * @return 实例对象*/private Object readResolve() {return instance;}/*** 用于避免反射对单例的破坏*/private Singleton() {if (instance != null) {throw new RuntimeException("illegal access");}}}

补充说明

        1. 支持延迟加载;

        2. 并发度高,在频繁调用时不会产生性能瓶颈。

静态内部类

代码示例

package com.sumlv.javase.note;/*** 单例示例** @Auther: yuzhuo.song* @Date: 2025-03-14*/
public class Singleton {public static Singleton getInstance() {return InnerClass.instance;}/*** 用于避免序列化对单例的破坏* 如果单例类没有实现序列化接口则不需要该方法* * @return 实例对象*/private Object readResolve() {return InnerClass.instance;}/*** 用于避免反射对单例的破坏*/private Singleton() {if (InnerClass.instance != null) {throw new RuntimeException("illegal access");}}private static class InnerClass {private static Singleton instance = new Singleton();}}

补充说明

        1. 支持延迟加载;

        2. 并发度高,在频繁调用时不会产生性能瓶颈。

        3. 实现方式相较于双重检查锁更为简洁。

枚举

代码示例

package com.sumlv.javase.note;/*** 单例示例** @Auther: yuzhuo.song* @Date: 2025-03-14*/
public enum Singleton {INSTANCE;public static Singleton getInstance() {return INSTANCE;}}

补充说明

        1. 最简单的单例实现方式;

        2. 线程安全;

        3. 无需关心反射和序列化对单例造成破坏;

http://www.dtcms.com/a/360979.html

相关文章:

  • Day19_【机器学习—线性回归 (3)—回归模型评估方法】
  • 网站模板源代码 静态网页网站模板
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 零售行业的 AI 革命:从用户画像到智能供应链,如何让 “精准营销” 不再是口号?
  • 百胜软件获邀出席第七届中国智慧零售大会,智能中台助力品牌零售数智变革
  • 百胜软件×OceanBase深度合作,赋能品牌零售数字化实践降本增效
  • leetcode 面试题17.19 消失的两个数字
  • Java学习笔记-反射(二)
  • 无公网IP,怎么实现远程调试与APP端api 接入?
  • 红楼梦 AI HTML 分析 - 好了歌
  • MySQL内置的各种单行函数
  • Kafka消息中间件安装配置
  • Ruoyi项目MyBatis升级MyBatis-Plus指南
  • sentinel异常处理机制
  • 2025机器人产业大洗牌:新兴初创企业的技术革命与崛起之路
  • 【Spring Cloud微服务】8.深度实战:微服务稳定性的守护神——Sentinel
  • Linux下usb设备驱动框架实现:定义核心结构体数据
  • 从Java全栈开发到微服务架构:一次真实的面试实录
  • leetcode算法刷题的第二十三天
  • GitLab 18.3 正式发布,更新多项 DevOps、CI/CD 功能【一】
  • Linux上perf工具的使用-基础采样
  • 云端虚拟云手机该如何进行使用?
  • 高并发场景下的热点数据处理:从预热到多级缓存的性能优化实践
  • 云手机和云游戏之间有着哪些区别?
  • 手机版碰一碰发视频源码搭建,技术实现与实操指南
  • 基于大数据的京东手机销售数据 可视化分析设计与开发03446原创的定制程序,java、PHP、python、C#小程序、文案全套、毕设程序定制、成品等
  • 【音视频】WebRTC QoS 概述
  • 云端虚拟手机:云手机的原理是什么?
  • 【科普向-第七篇】Git全家桶介绍:Git/Gitlab/GitHub/TortoiseGit/Sourcetree
  • 电动两轮车手机导航投屏方案调研报告