Java单例模式的应用示例


在Java中,单例模式是一种常用的设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点。以下是一个简单的单例模式实现示例,使用了懒汉式和饿汉式两种常见的实现方式。

### 懒汉式(线程不安全)


public class SingletonLazy {
    // 私有静态变量,延迟加载
    private static SingletonLazy instance;

    // 私有构造函数,防止外部实例化
    private SingletonLazy() {}

    // 提供一个全局的静态方法,返回唯一实例,使用时才进行实例化
    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

**注意**:这个懒汉式实现是线程不安全的。在多线程环境下,可能会创建多个实例。

### 懒汉式(线程安全)

为了解决线程安全问题,可以在`getInstance()`方法上添加`synchronized`关键字,但这会影响性能。

或者,使用双重检查锁定(Double-Checked Locking)来优化性能:


public class SingletonLazyThreadSafe {
    // 使用volatile关键字防止指令重排序
    private static volatile SingletonLazyThreadSafe instance;

    private SingletonLazyThreadSafe() {}

    public static SingletonLazyThreadSafe getInstance() {
        if (instance == null) {
            synchronized (SingletonLazyThreadSafe.class) {
                if (instance == null) {
                    instance = new SingletonLazyThreadSafe();
                }
            }
        }
        return instance;
    }
}

### 饿汉式

饿汉式单例在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。


public class SingletonEager {
    // 类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
    private static final SingletonEager instance = new SingletonEager();

    private SingletonEager() {}

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

以上示例展示了Java中单例模式的两种基本实现方式。懒汉式延迟加载实例,但可能面临线程安全问题;饿汉式则类加载时就完成实例化,避免了线程安全问题,但可能影响类加载的性能。