java单例模式学习示例


在Java中,单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点。以下是使用懒汉式(线程不安全)、懒汉式(线程安全)、饿汉式以及使用枚举实现单例模式的简单示例。

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


public class SingletonLazyUnsafe {
    private static SingletonLazyUnsafe instance;

    private SingletonLazyUnsafe() {}

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

**注意**:这种实现方式在多线程环境下可能不安全,因为两个线程可能同时判断`instance`为null,然后都创建了一个新的实例。

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


public class SingletonLazySafe {
    private static volatile SingletonLazySafe instance;

    private SingletonLazySafe() {}

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

    // 或者使用双重检查锁定(Double-Check Locking)优化性能
    // public static SingletonLazySafe getInstance() {
    //     if (instance == null) {
    //         synchronized (SingletonLazySafe.class) {
    //             if (instance == null) {
    //                 instance = new SingletonLazySafe();
    //             }
    //         }
    //     }
    //     return instance;
    // }
}

**注意**:使用`synchronized`关键字或双重检查锁定可以实现线程安全,但后者性能更优。

### 饿汉式


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

    private SingletonEager() {}

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

**注意**:这种方式基于类加载机制避免了多线程的同步问题,但是在类装载时就完成了实例化,没有达到Lazy Loading的效果。

### 使用枚举


public enum SingletonEnum {
    INSTANCE;

    // 可以添加方法
    public void whateverMethod() {
    }
}

**注意**:这种方法不仅代码简洁,而且由JVM从根本上提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或反射攻击的时候,这种单例的类仍然安全。

以上是Java中实现单例模式的几种常见方式。在实际开发中,可以根据具体需求选择最适合的实现方式。