单例设计模式

1.概念

单例设计模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式对于那些需要频繁实例化然后销毁的对象非常有用,或者当某个类只能有一个实例发挥作用时,比如线程池、缓存、对话框、注册表设置、日志对象等。

2.实现

2.1 懒汉式(线程不安全)

这是最简单的实现方式,但在多线程环境下可能会产生多个实例。因此,这种方式一般不推荐直接使用。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
2.2 懒汉式(线程安全)

使用同步方法确保线程安全,但这会导致每次调用 getInstance 方法时都会同步,影响性能。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
2.3懒汉式(双重检查锁定)

这是懒汉式的改进版,只在必要时同步,提高了性能。

public class Singleton {
    private volatile static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
2.4饿汉式

在类加载时就创建实例,无需同步,但是会在程序启动时就占用内存资源。

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

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
2.5枚举

利用枚举类型的唯一性来保证单例性,简洁且线程安全。

public enum Singleton {
    INSTANCE;

    // 可以添加其他成员变量和方法
    public void someMethod() {
        // ...
    }
}
2.6静态内部类

使用静态内部类的方式,只有当外部类被加载后才会加载内部类,从而实现延迟加载。

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

3.总结

3.1 实现原理

        ①单例模式的核心在于构造函数私有化和提供一个公共的静态方法获取该类的唯一实例。

        ②私有构造函数防止外部直接构造新实例。

        ③公共静态方法确保外部可以通过该方法获取唯一的实例。

3.2 线程安全性

        ①多线程环境中,必须确保线程安全。

        ②使用同步块或 volatile 关键字来保证可见性和有序性。

3.3 延迟加载

        ①懒汉式实现了延迟加载,即在需要时才创建实例。

        ②饿汉式则是在类加载时就创建实例。

你可能感兴趣的:(设计模式,java,开发语言)