2026/4/3 6:08:50
网站建设
项目流程
十九冶成都建设有限公司网站,公司设计网站需要注意哪些,中国菲律宾男篮,图片在线制作加字Java 单例模式的五种实现#xff1a;饿汉式、懒汉式、DCL、静态内部类、枚举单例
在 Java 面试中#xff0c;单例模式几乎是必问内容。虽然看似简单#xff0c;但不同实现方式的线程安全、性能以及是否能抵御反射与序列化攻击#xff0c;都存在巨大的差异。 这次#xff…Java 单例模式的五种实现饿汉式、懒汉式、DCL、静态内部类、枚举单例在 Java 面试中单例模式几乎是必问内容。虽然看似简单但不同实现方式的线程安全、性能以及是否能抵御反射与序列化攻击都存在巨大的差异。这次卷卷就来将单例模式常见的五种实现方式进行整理和对比适合用于学习、复习以及面试答题。一、饿汉式最简单但可能浪费资源实现思想类加载时就创建单例对象无需加锁线程安全。优点实现简单JVM 类加载机制保证线程安全无需额外锁开销运行效率高缺点实例在类加载时就创建 → 如果初始化很重或实际没被使用会浪费资源适用场景实例非常轻量或者确定一定会使用的单例场景。二、懒汉式节约资源但线程不安全实现思想实例在第一次访问时创建。优点延迟加载节省资源缺点线程不安全多线程下可能会创建多个实例需要额外同步措施才能安全使用改进方式通过 synchronized 或 DCL 实现线程安全版本。三、双重检查锁DCLDouble-Check Locking要解决的问题懒汉式直接加锁效率太低每次获取实例都要锁一次。优化点第一次判断实例是否为空提高性能第二次在锁内判断保证线程安全仅首次创建实例时加锁后续访问无需锁关键点实例引用必须加上volatile否则可能出现指令重排导致拿到未初始化完成的对象。优点线程安全性能很好只第一次加锁仍然支持懒加载四、静态内部类推荐写法实现思想利用类加载机制实现懒加载与线程安全。内部类不会随外部类加载只有调用getInstance()时才加载内部类并创建实例。优点写法最简单天然线程安全可实现懒加载不用加锁性能最好示例publicclassSingleton{privateSingleton(){}privatestaticclassHolder{privatestaticfinalSingletonINSTANCEnewSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}五、枚举单例Java 官方推荐终极方案特点利用枚举类型实现单例是 Java 中唯一完全防御反射攻击反序列化攻击的单例写法。优点JVM 枚举底层保证实例唯一防止反射创建新对象防止反序列化生成新对象实现最简洁示例publicenumSingleton{INSTANCE;}六、五种单例方式对比总结面试高频实现方式是否懒加载是否线程安全是否安全抵御反射/序列化性能饿汉式否是否高懒汉式未加锁是否否高懒汉式 synchronized是是否低DCL是是需 volatile否高静态内部类是是否很高推荐枚举单例否是是唯一很高七、面试官喜欢听的总结如果在面试中被问到“你更推荐哪种单例模式”可以这样回答我更推荐使用静态内部类方式因为它结合了懒加载、线程安全以及高性能的所有优点写法简洁且稳定。如果对安全性要求极高防止反射、反序列化那枚举单例是最稳妥的选择。八、卷式总结饿汉式太着急懒汉式太磨叽DCL 看着帅但少个 volatile 就寄静态内部类不声不响地最稳枚举更离谱反射打不过它序列化打不过它我也打不过它。总之就是一句话单例不难难的是理解单例为什么不难。今天的脑细胞库存-1知识储备1算是赚了。