什么是单例模式?有几种
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方式。它常用于需要全局访问且只能存在一个实例的情况,例如数据库连接、线程池、配置对象等。
在单例模式中,通过限制类的实例化过程,确保只能创建一个实例,并提供一个访问该实例的静态方法。
常见的单例模式实现方式包括以下几种:
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;
}
}
以上是常见的几种单例模式的实现方式,每种方式都有其适用的场景和特点。选择适合的单例模式实现方式需要考虑线程安全性、性能需求和代码复杂度等因素。
猜你喜欢LIKE
相关推荐HOT
更多>>什么是单例模式?有几种
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方式。它常用于需要全局访问且只能存在一个实例的情况,例如数据...详情>>
2023-06-20 11:59:24线程安全与线程不安全?
线程安全(ThreadSafety)和线程不安全(ThreadUnsafety)是在多线程编程中用来描述代码或数据结构在并发环境中的行为的概念。线程安全指的是在多线...详情>>
2023-06-05 17:26:00如何在javascript中获取当前日期
在JavaScript中,可以使用内置的Date对象来获取当前日期和时间。可以使用以下代码来获取当前日期:这段代码会创建一个新的Date对象,该对象表示...详情>>
2023-03-17 15:41:10JavaScript模块化规范有哪些
在JavaScript中,常用的模块化规范有以下几种:CommonJS规范:主要用于服务器端编程,是Node.js采用的模块化规范。通过require方法加载模块,通...详情>>
2023-03-06 15:33:52