两版懒汉式
第一版直接将synchronized加入到类上
第二版采用DCL模式,性能更好。
//第一版 锁的范围太大,性能比较低
public class Singleton2 {
private Singleton2(){
}
private static Singleton2 singleton2;
public synchronized static Singleton2 getInstance(){
if(singleton2 == null){
singleton2 = new Singleton2();
}
return singleton2;
}
}
//第二版 DCL创建单例对象 双重检测锁 DOUBLE CHECK LOCK
public class Singleton2 {
private Singleton2(){
}
// 问题1:解释为什么要加 volatile ? => synchronized里面的代码块是有可能会重排序的,volatile有序性,可以防止指令重排。
private volatile static Singleton2 singleton2;
// 问题2:对比第一版, 说出这样做的意义 =>第二次调用的时候,如果不为空,就可以直接返回了,保证性能优越性。
public static Singleton2 getInstance(){
if(singleton2 == null){
synchronized (Singleton2.class){
// 问题3:为什么还要在这里加为空判断, 之前不是判断过了吗 =>防止对象重复创建
if(singleton2 == null){
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
}
问题总结:
第一版相对于第二版的缺点?
第二版中:
问题1:解释为什么要加 volatile ?
问题2:对比第一版, 说出这样做的意义?
问题3:为什么还要在这里加为空判断, 之前不是判断过了吗?