2025-05-19 13:47

java中的单一实例的三种常用实现方式

王姐姐

Java后端

(78)

(0)

收藏

以下是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条评论

点击登录参与评论