java实现单例模式为什么要加双重锁
时间: 2025-07-28 22:35:04 浏览: 13
在Java中实现单例模式时,使用**双重检查锁定**(Double-Checked Locking,DCL)是为了在保证线程安全的同时,提升性能。传统的单例实现方式(如直接在`getInstance()`方法上使用`synchronized`关键字)会导致每次调用该方法时都需要获取锁,这在多线程环境下会对性能造成较大影响。而双重检查锁定通过减少锁的持有时间,优化了这一过程。
双重检查锁定的核心思想是在进入同步代码块之前先进行一次检查,只有在单例实例尚未创建时才进入同步块。进入同步块后,再进行一次检查,以确保没有其他线程在同步块外检查为`null`之后创建了实例。这种双重检查机制确保了单例的唯一性,同时避免了不必要的同步开销。
此外,为了确保实例的创建过程在多线程环境下的可见性和有序性,需要将单例实例声明为`volatile`类型。`volatile`关键字的作用包括:
- **保证可见性**:一个线程对`volatile`变量的修改对其他线程是立即可见的。
- **防止指令重排序**:在创建对象时,JVM可能会对指令进行重排序以优化性能,这可能导致对象未完全构造完成就被其他线程访问。使用`volatile`可以避免这种情况,确保对象在构造完成之后才被赋值给引用变量[^2]。
以下是一个典型的双重检查锁定实现单例的示例代码:
```java
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;
}
}
```
代码中,第一次检查`instance == null`是为了避免不必要的同步,第二次检查是为了确保只有一个线程能够创建实例。这种方式在保证线程安全的前提下,有效减少了锁的使用频率,从而提高了性能[^4]。
###
阅读全文
相关推荐



















