当前位置: 首页 > 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()方法)。

相关文章:

  • R2S2:通过现实世界现成的技能空间释放人形机器人的潜力
  • 新手前端开发常见问题之层级问题
  • Node.js特训专栏-基础篇:3. Node.js内置模块的使用
  • 数据结构与算法-线性表-线性表的应用
  • HarmonyOS 5 Cordova有哪些热门插件?
  • vue3 标签页tab切换实现方法
  • 最大闭合子图学习笔记 / P2805 [NOI2009] 植物大战僵尸
  • antd vue a-range-picker如何设置不能选择当前和之后的时间,包含时分秒
  • linux thermal framework(3)_thermal cooling device
  • meshgpt 笔记2
  • java集合篇(六) ---- ListIterator 接口
  • 性能测试——搭建Prometheus+Grafana平台
  • React SSR同构渲染方案是什么?
  • RAG详解
  • 30个供应链指标与计算公式汇总,直接套用
  • 《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数
  • Unity 接入抖音小游戏二
  • FlashAttention:突破Transformer内存瓶颈的革命性注意力优化技术
  • 如何实现一个登录功能?
  • 一个简单的torch-cuda demo
  • 知名响应式网站企业/网页制作公司哪家好
  • 大型网站系统图/搜索引擎优化的基本方法
  • wordpress链接转换/seo网站优化推荐
  • 我制作了一个网站/焦作网络推广哪家好
  • 网站推广实践内容/百度网页游戏
  • 粉丝网站制作/百度搜索引擎怎么做