双重检查懒加载
双重检查懒加载需要控制单例的可见性,多线程情况下可能出现空指针问题
/**
* 双重检查单例模式
*/
public class DoubleCheckSingleton {
//未使用volatile 可能在初始化的时候出现内存屏障内的指令重排,
// 导致后续线程读取到第一个判断时候获取到初始化的值,而不是单例的值
// private static DoubleCheckSingleton singleton;
/**
* 修改版本保证单例的可见性和指令重排的可能新性
*/
private static volatile DoubleCheckSingleton singleton;
private DoubleCheckSingl