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

Java单例模式有几种实现方式

1. 饿汉式(Eager Initialization)

实现方式

  • 静态常量:类加载时直接初始化实例。
    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;static { 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;}
    }
    
  • 同步方法:通过synchronized保证线程安全,但性能较差。
    public static synchronized Singleton getInstance() { ... }
    

特点

  • 优点:延迟加载,节省内存。
  • 缺点:同步锁导致性能瓶颈。
  • 引用:

3. 双重检查锁定(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;}
}

特点

  • 优点:线程安全且延迟加载,性能优于同步方法。
  • 缺点:代码复杂度较高。
  • 引用:

4. 静态内部类

实现方式
利用JVM类加载机制保证线程安全。

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

特点

  • 优点:延迟加载,线程安全,无需同步锁。
  • 缺点:需额外定义内部类。
  • 引用:

5. 枚举(推荐)

实现方式
天然支持线程安全与序列化防护。

public enum Singleton {INSTANCE;public void doSomething() { /* ... */ }
}

特点

  • 优点:
    • 线程安全,无需同步机制。
    • 防止反射与序列化攻击。
    • 代码简洁,可扩展(可添加方法)。
  • 缺点:不支持延迟加载。
  • 引用:

实现方式对比

方式线程安全延迟加载防反射/序列化代码复杂度推荐优先级
饿汉式✔️4
懒汉式(同步)✔️✔️3
双重检查锁定✔️✔️2
静态内部类✔️✔️1
枚举✔️✔️极低最高

最佳实践建议

  1. 优先选择枚举:适用于大多数场景,兼顾安全与简洁。
  2. 延迟加载需求:使用静态内部类或双重检查锁定。
  3. 反射与序列化防护:枚举天然支持,其他方式需手动添加防御代码(如私有构造器校验、readResolve()方法)。
http://www.xdnf.cn/news/1017739.html

相关文章:

  • 为什么py文件打包后大小会增加很多?
  • 亚马逊云 Lambda 容器化部署教程
  • Rust 学习笔记:关于处理任意数量的 future 的练习题
  • Redis 使用场景、缓存什么数据?怎么保证数据一致性?
  • 自定义线程池 4.0
  • 基于51单片机的简易售货机系统
  • 使用 C/C++ 和 OpenCV 构建智能停车场视觉管理系统
  • 在GIS 工作流中实现数据处理(4)
  • 用Java实现常见排序算法详解
  • 玩转Docker | 使用Docker部署vaultwarden密码管理器
  • 让 Deepseek 写电器电费计算器(html版本)
  • 使用docker compose部署netmaker打通内网
  • JDK 8u231安装教程 - Windows 64位下载安装及环境变量配置指南
  • 解决U盘安装Win11无法命令行跳过联网激活的问题
  • java复习 11
  • 使用 C++/OpenCV 和 libevent 构建远程智能停车场管理系统
  • 每天宜搭宜搭小知识—报表组件—柱线混合图
  • 算法第15天:继续二叉树|前序递归+回溯与前序递归的场景总结、最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树
  • Mac电脑 系统监测工具 System Dashboard Pro
  • 【leetcode】543. 二叉树的直径
  • uni-app项目实战笔记4--使用组件具名插槽slot定义公共标题模块
  • 案例:城市“光革命”背后,塔能科技的智能照明进化方程式
  • 欧美简洁时尚风格通用PPT模版分享
  • 麒麟信安支撑2025年电力监控系统安全运维新技能推广应用示范培训班顺利举办
  • Java + easyexcel 新旧数据对比,单元格值标红
  • 优化 Excel 文件可以提升文件性能、减少文件大小并加快计算速度
  • mysql中替换字符串(正则)
  • mapbox进阶,切片网格生成实现
  • 深入理解Python协程:asyncio、异步并发、事件循环
  • 开疆智能ModbusTCP转Devicenet网关连接三菱PLC与ABB机器人配置案例