单实例,双重检查锁,流程图
时间: 2025-07-01 19:05:17 浏览: 12
单例模式中的双重检查锁定(Double-Checked Locking)是一种高效的实现方式,主要用于多线程环境下确保类的实例只被创建一次,并减少同步带来的性能开销。其核心思想是通过两次检查实例是否已经创建,从而避免不必要的加锁操作。
### 双重检查锁定的实现原理
在实现中,首先判断实例是否存在,如果不存在再进入同步代码块进行初始化。在同步代码块内部,再次检查实例是否存在,以防止多个线程同时进入同步块导致重复初始化。这种机制通过减少锁的持有时间来提高并发性能。
以下是基于 Java 的双重检查锁定实现示例:
```java
public class Singleton {
// 使用 volatile 关键字确保多线程环境下的可见性
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;
}
}
```
### 执行流程说明
1. **第一次检查**:线程尝试获取实例时,首先检查 `instance` 是否为 `null`。如果是,则进入同步代码块。
2. **加锁**:线程获得锁后,再次检查 `instance` 是否为 `null`,以确保没有其他线程在此期间创建了实例。
3. **第二次检查与初始化**:如果 `instance` 仍然为 `null`,则创建新实例并分配内存。
4. **返回实例**:无论是否进入同步代码块,最终都返回 `instance`。
### 流程图表示
以下是一个简化的执行流程描述:
```
开始
│
├── 检查 instance 是否为 null?
│ │
│ ├── 是 → 进入同步块
│ │
│ ├── 再次检查 instance 是否为 null?
│ │ │
│ │ ├── 是 → 创建新实例
│ │ └── 否 → 跳过创建步骤
│ │
│ └── 返回 instance
│
└── 否 → 返回 instance
结束
```
### 关键点总结
- **volatile 关键字**:确保变量修改对所有线程的可见性,防止指令重排序导致的问题[^1]。
- **synchronized 锁机制**:保证同一时刻只有一个线程可以进入关键区域,防止并发问题。
- **双重检查机制**:减少不必要的加锁操作,提高程序性能。
阅读全文
相关推荐



















