java 单例双重检查锁
时间: 2024-08-29 09:02:57 浏览: 46
在Java中,单例模式是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个全局访问点。而双重检查锁定(Double-Checked Locking)是单例模式的一种优化版本,主要用于解决线程安全问题,特别是在延迟加载场景下。
基本思想是在初始化实例之前做两次检查:
1. 第一次检查:看是否有其他线程正在尝试创建实例。如果不存在,则进入临界区加锁。
2. 第二次检查:再次确认实例是否已经完成初始化。如果没有,那么就真正地创建实例并设置为静态变量。
这样做的好处在于,在多线程环境中,只有当第一次检查发现尚未初始化并且没有其他线程持有锁时,才会创建实例,从而避免了不必要的同步开销。
以下是Java中的双重检查锁定的一个示例代码:
```java
public class Singleton {
private volatile static Singleton instance;
// 防止多次初始化
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (Singleton.class) { // 加锁
if (instance == null) { // 再次检查
instance = new Singleton(); // 创建并设置实例
}
}
}
return instance;
}
}
```
阅读全文