📜  什么单例 java spring - Java (1)

📅  最后修改于: 2023-12-03 15:36:07.559000             🧑  作者: Mango

什么是单例模式?

单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式的主要目的是限制类的实例化次数,从而实现资源的以及线程的管理。在 Java 中,单例模式被广泛应用于 Spring 等框架中。

Java 单例模式的实现方式

Java 单例模式具有多种实现方式,包括以下几种。

饿汉式单例模式

饿汉式单例模式是最简单的实现方式之一,其主要实现类似于一个静态变量。在类加载时即创建实例,因此称为“饿汉式”。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

上面代码中的 Singleton 类在实例化时,直接创建一份 instance 实例,并使用私有构造函数确保无法再次实例化该类。getInstance() 方法返回该 instance 实例。

懒汉式单例模式

懒汉式单例模式也是常见的实现方式之一,它会延迟实例化单例对象,避免无谓的资源浪费。

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

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

上面代码中的 Singleton 类不会在类加载时实例化 instance,而是在getInstance() 方法调用时才进行实例化。需要注意的是,由于在多线程环境下存在竞态条件,因此需要通过 synchronized 关键字或 Double-check Locking 的方式对 getInstance() 方法进行同步处理。

枚举式单例模式

枚举式单例模式是使用最广泛的实现方式之一,它是基于 Java 中枚举类型的特性实现的。

public enum Singleton {
    INSTANCE;

    // Singleton 方法
    public void method() {}
}

上面代码中的 Singleton 使用了枚举类型的方式,枚举类型被设计成单例模式的形式,并在枚举类型中实现 Singleton 的方法。

Spring 中的单例模式

在 Spring 中,单例模式是默认的 Bean作用域(Scope),因此在 Spring 容器中,所有被管理的 Bean 实例默认都是单例模式的实例。

默认情况下,Spring 中的单例模式并不一定是线程安全的。可以通过配置 中的 default-lazy-init 属性来控制 Bean 的延迟加载行为,并通过设置 中的 scope 属性来控制 Bean 的作用域。

例如,以下配置可以实现线程安全且延迟加载的单例模式。

<beans default-lazy-init="true">
    <bean id="mySingleton" class="com.example.MySingleton" scope="singleton" lazy-init="true" />
</beans>

上面的配置中,mySingleton Bean 的作用域被设置为 singleton,且延迟加载,因此可以保证实现线程安全的、延迟加载的单例模式。

以上就是单例模式的介绍,以及在 Java 和 Spring 中的实现方式。希望可以对程序员朋友们有所帮助。