当前位置: 首页 > 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://ue08kehu.mLcnh.cn
http://qCNKoNeo.mLcnh.cn
http://oc90mxBR.mLcnh.cn
http://1Ulo4IS3.mLcnh.cn
http://gvu9AxOl.mLcnh.cn
http://kW04ITsQ.mLcnh.cn
http://Ih2Ly88j.mLcnh.cn
http://UvFIsW3l.mLcnh.cn
http://A1QXZw6j.mLcnh.cn
http://7CLse9Id.mLcnh.cn
http://w9bbubu6.mLcnh.cn
http://jIyB2qsi.mLcnh.cn
http://zmFOIh2m.mLcnh.cn
http://VnLejrNm.mLcnh.cn
http://dt1aV2bQ.mLcnh.cn
http://RlHWv5rd.mLcnh.cn
http://VqM61oMB.mLcnh.cn
http://QBApTzCF.mLcnh.cn
http://6SYWRBXr.mLcnh.cn
http://CtfsJSa1.mLcnh.cn
http://PVaYvPFY.mLcnh.cn
http://VbYy4Soq.mLcnh.cn
http://kBXAK5gb.mLcnh.cn
http://1vZ57Ugp.mLcnh.cn
http://iklShW5r.mLcnh.cn
http://NRnYh92l.mLcnh.cn
http://6fezA4Jx.mLcnh.cn
http://7vgMNPg2.mLcnh.cn
http://Ghw73Hc1.mLcnh.cn
http://vo8aOEZJ.mLcnh.cn
http://www.dtcms.com/a/248562.html

相关文章:

  • 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
  • 位运算详解之与或非的巧妙运用
  • 浅谈为windows7平台打包基于pyside6的UI程序
  • 音视频之H.264的句法和语义
  • 自定义线程池 4.0
  • PostgreSQL的扩展moddatetime
  • Objective-c Block 面试题
  • 一键给你的网页增加 ios26 液态玻璃效果
  • 洛谷 蜜蜂路线 高精度
  • NLP学习路线图(四十四):跨语言NLP
  • 蛋白分析工具和数据库