Java面试题之多线程 单例模式的双检锁是什么?
双检锁(Double-Checked Locking)是一种用于实现单例模式的设计模式,旨在减少多线程环境下的同步开销。它通过在获取锁的前后进行两次检查来确保线程安全,同时避免不必要的同步。
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;
}
}
instance
是否为 null
。如果不为 null
,则直接返回实例,避免了不必要的同步开销。instance
为 null
,则进入同步块,确保只有一个线程可以进入这个代码块。instance
是否为 null
。这是因为在第一个检查之后,可能有其他线程已经创建了实例。instance
仍然为 null
,则创建新的实例。volatile
关键字可以确保当 instance
被初始化时,其他线程能够看到这个实例的正确状态,避免出现指令重排序的问题。双检锁是一种高效的单例模式实现方式,适用于多线程环境。通过两次检查和适当的同步机制,它能够确保线程安全,同时提高性能。