DINGDANGMAOUP
DINGDANGMAOUP
Published on 2025-08-29 / 63 Visits
0
0

线程安全单例模式

线程安全的单例模式

什么是线程安全的单例模式?

线程安全的单例模式是一种设计模式,确保在多线程环境下,一个类只有一个实例,并且该实例能够被安全地访问和初始化。这种模式常用于需要全局唯一对象的场景,如配置管理、日志记录器等。

实现线程安全单例的方法

1. 懒汉式(双重检查锁定)

使用双重检查锁定机制,在保证性能的同时实现线程安全。

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

2. 饿汉式

在类加载时就创建实例,避免了多线程同步问题。

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

3. 静态内部类

利用类加载机制保证线程安全,同时实现懒加载。

public class Singleton {
    private Singleton() {}
    
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

4. 枚举实现

使用枚举类型实现单例,这是最简洁且线程安全的方式。

public enum Singleton {
    INSTANCE;
    
    public void doSomething() {
        // 业务方法
    }
}

线程安全考虑因素

  • 可见性:使用 volatile 关键字确保多线程环境下的可见性

  • 原子性:通过同步机制保证操作的原子性

  • 有序性:防止指令重排序导致的问题

适用场景

  • 需要频繁创建和销毁的对象

  • 创建对象耗时过多或耗资源过多

  • 经常使用的对象

  • 工具类对象

  • 频繁访问数据库或文件的对象

注意事项

  • 避免使用反射破坏单例

  • 考虑序列化和反序列化的问题

  • 注意内存泄漏问题

  • 合理选择实现方式,平衡性能和安全性


Comment