单例模式(Singleton)

单例模式的目的是确保某个类只有一个实例存在,并且提供一个全局的访问点。该模式适用于需要实例化对象开销较大的场景,如数据库连接、日志记录器等。

在Java中实现单例模式有多种方式,每种方式有其特定的使用场景和优缺点。下面将介绍三种常见的单例模式实现方式:懒汉式(线程不安全)、懒汉式(线程安全)、以及使用枚举。

懒汉式(线程不安全)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

这种实现在多线程环境下,如果多个线程同时调用getInstance()方法,可能会创建多个实例。

懒汉式(线程安全) 使用synchronized关键字,确保线程安全。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

这种方式虽然线程安全,但每次调用getInstance()方法时都需要进行同步,效率较低。

使用枚举 这是实现单例模式的最佳方法,它更简洁,自动支持序列化机制,绝对防止多次实例化。

public enum Singleton {
    INSTANCE; // 定义了一个枚举的元素,它就代表了Singleton的一个实例。
    public void someMethod() { // 这里可以定义一些方法。
        // 方法体...
    }
}

这种方式简单、自动支持序列化机制、绝对防止多次实例化。使用枚举方式不仅能避免多线程同步问题,而且还能防止反序列化导致重新创建新的对象。这是实现单例的最佳方法。