以下是Java中单例模式的三种经典写法及其特点:
1. 饿汉式(线程安全)
在类加载时直接初始化实例,利用JVM类加载机制保证线程安全。
public class HungrySingleton { private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton() {} // 私有构造 public static HungrySingleton getInstance() { return instance; } }
特点:
线程安全,但可能造成资源浪费(实例未被使用时仍占用内存)。
2. 懒汉式(双重检查锁 + volatile)
延迟初始化,通过双重检查锁和volatile解决线程安全问题。
public class LazySingleton { private static volatile LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { synchronized (LazySingleton.class) { if (instance == null) { instance = new LazySingleton(); } } } return instance; } }
特点:
懒加载,节省资源;
volatile防止指令重排序导致未初始化对象被暴露。
3. 静态内部类(线程安全 + 懒加载)
利用静态内部类的加载机制实现懒加载,无需同步锁。
public class InnerClassSingleton { private InnerClassSingleton() {} private static class SingletonHolder { private static final InnerClassSingleton INSTANCE = new InnerClassSingleton(); } public static InnerClassSingleton getInstance() { return SingletonHolder.INSTANCE; } }
特点:
线程安全且懒加载;
实现简洁,无性能损耗。
4.对比总结
写法 线程安全 懒加载 性能 适用场景
饿汉式 ✔️ ✖️ 高 实例占用资源少且频繁使用
双重检查锁 ✔️ ✔️ 中等 (同步开销) 需严格懒加载的高并发场景
静态内部类 ✔️ ✔️ 高 推荐大多数场景
5.扩展建议:
若需绝对防反射/序列化破坏单例,可考虑枚举实现(如public enum Singleton { INSTANCE; })。
0条评论
点击登录参与评论