📅  最后修改于: 2023-12-03 15:36:07.559000             🧑  作者: Mango
单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式的主要目的是限制类的实例化次数,从而实现资源的以及线程的管理。在 Java 中,单例模式被广泛应用于 Spring 等框架中。
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 中,单例模式是默认的 Bean作用域(Scope),因此在 Spring 容器中,所有被管理的 Bean 实例默认都是单例模式的实例。
默认情况下,Spring 中的单例模式并不一定是线程安全的。可以通过配置
例如,以下配置可以实现线程安全且延迟加载的单例模式。
<beans default-lazy-init="true">
<bean id="mySingleton" class="com.example.MySingleton" scope="singleton" lazy-init="true" />
</beans>
上面的配置中,mySingleton Bean 的作用域被设置为 singleton,且延迟加载,因此可以保证实现线程安全的、延迟加载的单例模式。
以上就是单例模式的介绍,以及在 Java 和 Spring 中的实现方式。希望可以对程序员朋友们有所帮助。