双重判空第一层防止多次加锁浪费资源第二层判断instance是否已经初始化 A a = new A(); 分成三小步: 1、分配内存空间 2、创建实例对象 3、将地址和对象连接起来 volatile作用防止指令重排序如果不使用该关键字,123可能变成132。当线程A走到第二层判空时,实例化对象,释放锁资源。此时,实例对象还没有创建成功。线程B走到第一层判空,instance不为null,走不进去,获取不到锁资源。