双重检查机制(Double-Check Locking)是一种用于多线程编程中实现延迟初始化(Lazy Initialization)的设计模式。它的主要目的是在多线程环境下,确保某个资源(通常是一个对象或单例)只会被初始化一次,以提高性能和减少资源消耗。
该机制的核心思想是,在多线程环境中,首先检查资源是否已经被初始化,如果没有,则再次检查资源是否已经被初始化,如果还没有,则进行初始化。这两次检查之间通过同步机制来保证只有一个线程能够执行初始化操作。
案例1:
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {
// 私有构造函数,防止外部实例化
}
public static LazySingleton getInstance() {
if (instance == null) { // 第一次检查,提高性能
synchronized (LazySingleton.class) {
if (instance == null) { // 第二次检查,确保只有一个线程初始化
instance = new LazySingleton();
}
}
}
return instance;
}
}
案例2: