📜  什么是 Singleton,你在你的框架中使用什么? (1)

📅  最后修改于: 2023-12-03 14:49:09.759000             🧑  作者: Mango

什么是 Singleton, 你在你的框架中使用什么?

Singleton模式简介

Singleton模式是指某个类只允许创建一个实例,且该实例提供了一个全局访问点。在实际应用中,Singleton模式往往被用来代表全局唯一的资源,例如配置文件、日志文件等等。

Singleton模式的实现方式

在Java中,Singleton模式的实现方式通常有两种:

  1. 饿汉式(Eager)单例模式
  2. 懒汉式(Lazy)单例模式
饿汉式单例模式(Eager单例模式)

饿汉式单例模式是在类加载的时候就进行实例化,没有延迟加载的风险,因此是线程安全的。

示例代码如下:

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    private EagerSingleton() {}
    public static EagerSingleton getInstance() {
        return instance;
    }
}
懒汉式单例模式(Lazy单例模式)

懒汉式单例模式在类加载时并不进行实例化,而是在第一次访问该实例时进行实例化,因此可能存在线程安全的问题。

示例代码如下:

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

注意:

  1. 使用volatile关键字防止重排序导致的并发问题。
  2. 在锁内部添加null判断,避免每次请求都进行锁定。
你在你的框架中使用什么?

在我的框架中,我一般会使用懒汉式单例模式,因为懒汉式单例模式在使用时才进行实例化,能够降低资源的启动时间,提高系统的性能。

同时,在应用中,我们可能需要多个单例实例时,就需要使用多例模式,可以通过维护一个Map结构,将多个单例实例存储在Map中,实现多例模式。

示例代码如下:

public class MultiSingleton {
    private static Map<String, MultiSingleton> instanceMap = new HashMap<String, MultiSingleton>();
    static {
        instanceMap.put("Singleton1", new MultiSingleton());
        instanceMap.put("Singleton2", new MultiSingleton());
    }
    private MultiSingleton(){}
    public static MultiSingleton getInstance(String instanceName) {
        return instanceMap.get(instanceName);
    }
}

以上就是Singleton模式的介绍和实现方式,在实际应用中,我们需要根据实际情况选择不同的实现方式,以达到最优的效果。