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

23种设计模式-创建型模式之单例模式(Java版本)

Java 单例模式(Singleton Pattern)详解

🌟 什么是单例模式?

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问它。


🧠 使用场景

  • 配置管理类(如读取配置文件)
  • 日志工具类(如 Log4j 的 Logger)
  • 数据库连接池
  • 缓存管理
  • 线程池

✅ 实现方式(Java)

方式一:饿汉式(类加载时就实例化)

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
  • 优点:简单、线程安全
  • 缺点:类加载时就创建实例,可能浪费资源

方式二:懒汉式(线程不安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  • 缺点:多线程环境会创建多个实例

方式三:懒汉式 + synchronized(线程安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  • 缺点:加锁影响性能

方式四:双重检查锁(DCL)

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;}
}
  • 优点:懒加载 + 线程安全 + 性能较好
  • volatile 防止指令重排

方式五:静态内部类

public class Singleton {private Singleton() {}private static class Holder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;}
}
  • 优点:利用 JVM 机制,线程安全 + 懒加载 + 高性能

方式六:枚举实现(最推荐)

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("Doing something...");}
}
  • 优点:防反射、防反序列化、天然线程安全
  • 缺点:不能延迟加载

🔐 防止反射与反序列化破坏单例

防反射

private Singleton() {if (instance != null) {throw new RuntimeException("反射破坏单例!");}
}

防反序列化

private Object readResolve() {return instance;
}

📌 各方式对比

实现方式是否懒加载是否线程安全推荐度
饿汉式★★
懒汉式
synchronized★★
DCL★★★★
静态内部类★★★★★
枚举★★★★★(最安全)
http://www.xdnf.cn/news/51.html

相关文章:

  • CS144 Lab1实战记录:实现TCP重组器
  • Vue中v-if和v-show区别
  • Redis之全局唯一ID
  • Python解决“小D的abc字符变换”问题
  • 进程(Process)和进程管理
  • 十三种物联网/通信模块综合对比——《数据手册--物联网/通信模块》
  • HarmonyOS
  • 安全可靠+操作简捷——安科瑞预付费电表的用户体验升级
  • 代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)
  • Dell戴尔服务器 PowerEdge R750xs + window server2012r2 || 2016
  • B端网站建设,怎样平衡功能与美观,满足企业多元需求?
  • 【Kubernetes基础--Service深入理解】--查阅笔记4
  • 通过gird布局实现div的响应式分布排列
  • 【Linux】第十章 配置和保护SSH
  • Android Mainline简介
  • Doris的向量化执行如何支撑分布式架构和复杂查询
  • ShenNiusModularity项目源码学习(18:ShenNius.Admin.Mvc项目分析-3)
  • AOSP的Doze模式-DeepIdle 初识
  • vue3 Ts axios 封装
  • 十二种存储器综合对比——《器件手册--存储器》
  • 23种设计模式-创建型模式之工厂方法模式(Java版本)
  • 科学护理进行性核上性麻痹,缓解病痛提升生活质量
  • 【Java学习笔记】键盘录入方法
  • GPU怎么绑定到服务器上
  • 20个常用的初级Java笔试题及其参考答案
  • 通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
  • Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报
  • setTimeoutsetIntervalrequestAnimationFrame
  • FreeRTOS二值信号量详解与实战教程
  • 国内网络设备厂商名单(List of Domestic Network Equipment Manufacturers)