Java 如何实现 3 种单例模式?

1 答案

一 、饿汉式单例模式

class Singleton {
    // 创建类的同时创建对象,并保存在静态属性中,
    // 因为并不是按需创建对象,所以称为饿汉式
    private static final Singleton instance = new Singleton();
    // 将构造方法设为私有,禁止外部自行创建对象
    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

缺点:类每次使用时都会初始化静态成员变量(调用该类的其它方法时也会初始化),浪费内存。

优点:因为保存对象的是静态属性,对象随类一同创建,以后不再改变,所以线程安全。

二 、懒汉式

class Singleton {
    // 创建类的时候不会创建对象
    private static Singleton instance;
    // 将构造方法设为私有,禁止外部自行创建对象
    private Singleton() {}

    public static Singleton getInstance() {
        // 如果对象未创建过,则实例化,
        // 并保存起来供下次直接使用
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

缺点:
会有线程安全问题,加上同步代码块解决线程安全问题但效率低,加上双重检锁提高访问效率。
没有第一次检锁时,无论单例成员变量有没有被初始化线程都会等待。
加上第一次检索,当单例成员变量被初始化后无需等待直接返回对象引用。


三 、登记式

class Singleton {
    // 将构造方法设为私有,禁止外部自行创建对象
    private Singleton() {}

    private static class Holder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.instance;
    }
}

优点:内部类只有在被外部类调用时才会加载,延缓加载时间。

xiaobai xiaobai 4 月前 点赞 0