今天面试被问了懒汉式单例模式,没有答上来,现将答案记录下来
public class Solutionaaa {
private volatile static Solutionaaa solutionaaa = null; // 1
private Solutionaaa(){
}
public static Solutionaaa getSolutionaaa(){
if(solutionaaa == null){ // 2
synchronized (Solutionaaa.class){ // 3
if(solutionaaa == null){ // 4
solutionaaa = new Solutionaaa(); // 5
}
}
}
return solutionaaa;
}
}
以上便是懒汉式单例模式的写法,现在对于代码做一个解析
1. 使用volatile是为了防止指令重排
2. 是为了加快多线程模式下的运行速率,比如已经创建了一个实例,那么就不需要去竞争锁了
3+4. 是为了防止多线程模式下重复创建单例。有可能线程A竞争到了锁,然后创建了实例,退出了锁,此时线程B也进到临界区,此时如果没有if判断是否为null,那么就会重复创建实例
5. 创建单例