Skip to content

线程安全的单例模式

字数
335 字
阅读时间
2 分钟

1 饿汉式单例

在类加载时就创建实例,线程安全。

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

    private Singleton() {}

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

2 懒汉式单例(双重检查锁定)

在需要时才创建实例,保证线程安全。

java
public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton() {}

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

3 静态内部类

利用类加载机制,线程安全且实现延迟加载。

java
public class Singleton {
    private Singleton() {}

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

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

4 枚举方式

使用枚举类型实现单例,线程安全且防止反序列化。

java
public enum Singleton {
    INSTANCE;

    public void someMethod() {
        // 方法实现
    }
}

5 使用 synchronized 方法

简单但性能较低。

java
public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

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

6 使用 ThreadLocal (特定于线程)

每个线程都有自己的实例,不适用于全局共享。

java
public class Singleton {
    private static final ThreadLocal<Singleton> threadLocalInstance = ThreadLocal.withInitial(Singleton::new);

    private Singleton() {}

    public static Singleton getInstance() {
        return threadLocalInstance.get();
    }
}