以下是一个使用双检锁实现的线程安全单例模式示例代码:
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;
}
}
关键点说明:
volatile关键字确保多线程环境下变量的可见性- 双重检查锁定(双检锁):
- 外层检查避免每次调用都进入同步块
- 内层检查防止多个线程同时通过第一层检查后重复创建实例
- 私有构造函数阻止外部直接实例化
- 同步锁使用类对象作为锁,确保线程安全
此实现满足:
- 延迟初始化(懒加载)
- 线程安全
- 高效(仅在首次初始化时同步)