什么是单例模式?有几种
推荐
在线提问>>
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方式。它常用于需要全局访问且只能存在一个实例的情况,例如数据库连接、线程池、配置对象等。
在单例模式中,通过限制类的实例化过程,确保只能创建一个实例,并提供一个访问该实例的静态方法。
常见的单例模式实现方式包括以下几种:
1. 饿汉式(Eager Initialization):
- 在类加载时就创建实例,并在类内部持有该实例的引用。
- 线程安全,因为实例在类加载过程中就被创建。
- 示例:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
return instance;
}
}
2. 懒汉式(Lazy Initialization):
- 在第一次调用获取实例的方法时才创建实例。
- 需要考虑线程安全问题,可以通过加锁等方式保证线程安全。
- 示例:
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造函数
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 双重检查锁(Double-Checked Locking):
- 在懒汉式的基础上进行改进,使用双重检查来减少锁的竞争,提高性能。
- 示例:
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;
}
}
4. 静态内部类(Static Inner Class):
- 将实例化过程放在静态内部类中,通过类加载的机制保证只有一个实例。
- 延迟加载,线程安全。
- 示例:
public class Singleton {
private Singleton() {
// 私有构造函数
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
以上是常见的几种单例模式的实现方式,每种方式都有其适用的场景和特点。选择适合的单例模式实现方式需要考虑线程安全性、性能需求和代码复杂度等因素。
