/**
* 懒汉模式
* 延迟加载,只有在真正使用的时候,才开始实例化。
* 线程安全
* double check 双重检查 加锁优化
* 编译器(JIT),CPU有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile关键字进行修饰,
* 对于volatile修饰的字段,可以防止指令重排
*/
public class LazySingleton {
//volatile--防止重排序
private volatile static LazySingleton instance;
private LazySingleton(){
}
//在进行多线程操作时,会出现创建两个实例的情况,故加上(synchronized)锁保证只有一个实例存在
public static LazySingleton getInstance(){//synchronized 考虑到性能损耗,如果加在方法上则表示不管实例有没有初始化,都会加上锁
if(instance == null){
//为空时,再进行加锁。此时又会出现新的问题,当多个线程都到达这个地方后,第一个顺利执行后,实例化过后,后面的所有线程都会又实例化一次
//多个线程在此位置进行访问高并发还是会有一定的性能损耗
synchronized (LazySingleton.class){
//所以再加上一个条件
if(instance == null){
instance = new LazySingleton();
//字节码层面
//JIT CPU 可能对2.3.步骤进行重排序 造成空指针错误 如果解决? volatile--防止重排序
//1.分配空间
//2.初始化
//3.引用赋值
}
}
}
return instance;
}
}